Cloudflare changelogsUpdates to various Cloudflare productshttps://developers.cloudflare.com/changelog/Workers, Access - You can now enable Access on a Worker or all Workers at oncehttps://developers.cloudflare.com/changelog/post/2026-08-14-workers-access/https://developers.cloudflare.com/changelog/post/2026-08-14-workers-access/<p>You now have two new ways to protect your <a href="https://developers.cloudflare.com/workers/">Workers</a> with <a href="https://developers.cloudflare.com/workers/configuration/cloudflare-access/">Cloudflare Access</a>.</p> <p><strong>Protect an application across all its domains at once</strong></p> <p>Until now, if a Worker was reachable on a route, a Custom Domain, and a <code>workers.dev</code> URL, you had to manually add each one to an Access application and keep the list in sync whenever routes or domains changed.</p> <p>Now, Access attaches the policy to the Worker itself, so every associated domain and preview URL stays protected even when its routes or domains change.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1476,height=689,format=webp/_astro/protect-one-worker.BSpeeOry.png" alt="Access setting for protecting a single Worker" loading="lazy" decoding="async" width="1476" height="689"> <p><strong>Protect all new and existing Workers by default</strong></p> <p>Make all Workers private by default, so every existing and newly created Worker requires sign-in before anyone can reach it.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2436,height=1432,format=webp/_astro/protect-all-workers._AWy-S-E.png" alt="Account-wide Access setting that protects all Workers" loading="lazy" decoding="async" width="2436" height="1432"> <p>If a specific Worker should remain publicly accessible, add a Worker-level bypass to exempt it.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1228,height=756,format=webp/_astro/make-worker-public.D3yjPjtf.png" alt="Make a Worker public when all Workers are protected" loading="lazy" decoding="async" width="1228" height="756"> <p>Whether you protect a single application or all Workers at once, you can choose whether to protect preview deployments only or both previews and production, and control who can sign in by Cloudflare account membership, email address, or email domain.</p> <p>For more advanced policy options, edit the policy in <a href="https://dash.cloudflare.com/?to=/:account/one/access/apps" target="_blank" rel="noopener">Zero Trust<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1276,height=1220,format=webp/_astro/choose-who-can-sign-in.DKf3kWAK.png" alt="Access policy configuration for controlling who can sign in" loading="lazy" decoding="async" width="1276" height="1220"> <p><strong>View all of your Worker Access policies</strong></p> <p>You can view and manage all of your Access policies in the <strong>Access</strong> tab of the Workers &amp; Pages section in the dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1646,height=1366,format=webp/_astro/access-policies.DN7yCwHX.png" alt="Access tab showing all configured Access policies" loading="lazy" decoding="async" width="1646" height="1366"> <p><strong>See who is accessing your Worker</strong></p> <p>When Access is enabled on your Worker, every authenticated request includes <code>ctx.access</code>. Call <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#access"><code>ctx.access.getIdentity()</code></a> to get the user's email, name, and groups — no manual JWT validation required.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">ctx.access) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Access did not run"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">401</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> identity</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ctx.access.</span><span class="nb-shiki-1t8gfj">getIdentity</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ aud: ctx.access.aud, email: identity?.email });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p><strong>Test Access locally</strong></p> <p>You can now test Cloudflare Access locally with <code>wrangler dev</code>. Add a <code>dev</code> block to your <code>wrangler.jsonc</code>:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "access"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "dev"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "aud"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-app"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "identity"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"email"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"admin@example.com"</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Your Worker will receive this identity through <code>ctx.access</code> and <code>ctx.access.getIdentity()</code>, letting you test authenticated and unauthenticated flows without deploying. Remove the <code>dev</code> block to simulate unauthenticated requests.</p> <p><strong>API and programmatic access</strong></p> <p>You can also set up these policies through the <a href="https://developers.cloudflare.com/workers/configuration/cloudflare-access/">Workers API</a> instead of the dashboard.</p>Fri, 14 Aug 2026 00:00:00 GMTWorkersWorkersAccessArtifacts - Data localization support for Artifactshttps://developers.cloudflare.com/changelog/post/2026-08-13-artifacts-jurisdictions/https://developers.cloudflare.com/changelog/post/2026-08-13-artifacts-jurisdictions/<p>Artifacts now supports jurisdictions, allowing you to select the European Union or the United States as the only location where repo data is stored and processed.</p> <p>Select a jurisdiction when you create a namespace. Every repo in that namespace automatically uses the selected jurisdiction.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/artifacts/namespaces"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "namespace": "my-eu-namespace",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "jurisdiction": "eu"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>Jurisdictions cannot be changed after namespace creation. If you omit the jurisdiction, Artifacts creates an unrestricted namespace.</p> <p>For supported jurisdictions and usage details, refer to <a href="https://developers.cloudflare.com/artifacts/guides/data-localization/">Data localization</a>.</p>Thu, 13 Aug 2026 00:00:00 GMTArtifactsArtifactsGateway - Detect and control software package downloads with package registry securityhttps://developers.cloudflare.com/changelog/post/2026-08-13-package-protection/https://developers.cloudflare.com/changelog/post/2026-08-13-package-protection/<p>Cloudflare Gateway can now detect software package downloads and give you policy control over supply chain traffic. When a developer or CI/CD pipeline downloads a package through Gateway, the proxy identifies the registry protocol from the request URL and extracts the package ecosystem, name, version, and namespace. You can then write <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP policies</a> using <code>pkg.*</code> selectors to allow or block package downloads.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="supported-ecosystems">Supported ecosystems</h4><a class="anchor-link" href="#supported-ecosystems"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Gateway detects package downloads for the following ecosystems:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Ecosystem</th> <th>Namespace</th> </tr> </thead> <tbody> <tr> <td>npm</td> <td>Scope (for example, <code>@babel</code>)</td> </tr> <tr> <td>PyPI</td> <td>--</td> </tr> <tr> <td>RubyGems</td> <td>--</td> </tr> <tr> <td>Cargo</td> <td>--</td> </tr> <tr> <td>Go</td> <td>Module path</td> </tr> <tr> <td>Maven</td> <td>Group ID</td> </tr> <tr> <td>NuGet</td> <td>--</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="selectors">Selectors</h4><a class="anchor-link" href="#selectors"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In the dashboard, select <strong>Package Ecosystem</strong> to access the package registry selectors. After selecting a single ecosystem, nested fields for package name, version, and namespace become available. Five <code>pkg.*</code> selectors are available for HTTP policies with the Allow and Block actions:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Selector</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>pkg.ecosystem</code></td> <td>The package ecosystem detected from the request URL.</td> </tr> <tr> <td><code>pkg.name</code></td> <td>The package name extracted from the download URL.</td> </tr> <tr> <td><code>pkg.version</code></td> <td>The package version, with support for ecosystem-aware comparison operators.</td> </tr> <tr> <td><code>pkg.namespace</code></td> <td>The package namespace, when the ecosystem supports one.</td> </tr> <tr> <td><code>pkg.purl</code></td> <td>The <a href="https://github.com/package-url/purl-spec" target="_blank" rel="noopener">Package URL (PURL)<span class="external-link"> ↗</span></a> derived from the detected coordinates. Available in the API only.</td> </tr> </tbody> </table></div> <p>Detection is based on the registry protocol rather than the hostname, so it works the same way whether traffic goes to a public registry, a corporate proxy such as Artifactory or Nexus, or a self-hosted mirror.</p> <p>Package registry security requires <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tls-decryption/">TLS decryption</a> to be turned on.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/package-registry-security/">Package registry security</a>.</p>Thu, 13 Aug 2026 00:00:00 GMTGatewayGatewayRealtime - Control Realtime SFU DataChannel deliveryhttps://developers.cloudflare.com/changelog/post/2026-08-13-datachannels-reliability-ordering/https://developers.cloudflare.com/changelog/post/2026-08-13-datachannels-reliability-ordering/ <p><a href="https://developers.cloudflare.com/realtime/sfu/">Cloudflare Realtime SFU</a> is a <a href="https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/">WebRTC selective forwarding unit</a> that runs on Cloudflare's global network. It forwards audio, video, and application data between WebRTC clients without requiring you to manage SFU infrastructure or regions.</p> <p><a href="https://developers.cloudflare.com/realtime/sfu/datachannels/">DataChannels</a> are WebRTC channels for application messages. A client publishes a named DataChannel to Realtime SFU, and the SFU forwards its messages to every client that subscribes to that channel. Use DataChannels for low-latency payloads such as chat messages, game state, sensor updates, and control events.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Realtime SFU DataChannels now support unordered and partially reliable delivery. DataChannels remain reliable and ordered by default, so existing channels keep their current behavior.</p> <p>With ordered delivery, a delayed message can block later messages. For game state or sensor updates, recent data may be more useful than recovering an older message. Unordered delivery lets later messages proceed, while partial reliability limits retransmission attempts or delivery time.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="choose-delivery-behavior">Choose delivery behavior</h4><a class="anchor-link" href="#choose-delivery-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Delivery settings answer two questions: whether newer messages can bypass a delayed message, and when the transport should stop retrying delivery.</p> <p>Choose the policy that matches how long your payload remains useful:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Goal</th> <th>Settings</th> <th>Use when</th> </tr> </thead> <tbody> <tr> <td>Reliable, ordered delivery (default)</td> <td>Omit <code>ordered</code>, <code>maxRetransmits</code>, and <code>maxPacketLifeTime</code></td> <td>Messages remain useful and must arrive in order</td> </tr> <tr> <td>Reliable, unordered delivery</td> <td>Set <code>ordered: false</code>; omit both retry fields</td> <td>Messages remain useful, but later messages should not wait for earlier messages</td> </tr> <tr> <td>No retries or ordering</td> <td>Set <code>ordered: false</code> and <code>maxRetransmits: 0</code></td> <td>The application tolerates message loss and discards out-of-date updates</td> </tr> <tr> <td>Limited retries</td> <td>Set <code>maxRetransmits: &lt;COUNT&gt;</code></td> <td>Brief recovery is useful, but repeated retries are not</td> </tr> <tr> <td>Time-bounded delivery</td> <td>Set <code>maxPacketLifeTime: &lt;MILLISECONDS&gt;</code></td> <td>A message loses value after a known time window</td> </tr> </tbody> </table></div> <p><code>ordered</code> controls ordering independently from retries. <code>maxRetransmits</code> and <code>maxPacketLifeTime</code> are alternative retry budgets, so set at most one for each channel. Omit both for reliable delivery, whether ordered or unordered.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="apply-the-policy-end-to-end">Apply the policy end to end</h4><a class="anchor-link" href="#apply-the-policy-end-to-end"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Realtime DataChannels use negotiated IDs, so browsers do not receive delivery settings from the remote peer. Apply the same settings when the publisher creates the local channel, each subscriber pulls the remote channel, and each client calls <code>createDataChannel()</code>.</p> <p>The following example configures unordered delivery with no retransmissions. It begins after you <a href="https://developers.cloudflare.com/realtime/sfu/datachannels/#set-up-a-datachannel">establish a DataChannel transport on both sessions and complete any required SDP exchange</a>. Run the API requests from your backend with <code>APP_ID</code>, <code>APP_TOKEN</code>, <code>PUBLISHER_SESSION_ID</code>, and <code>SUBSCRIBER_SESSION_ID</code> set in your environment.</p> <div data-nb-steps class="steps" data-astro-cid-sfejetki><ol> <li>On the publisher session, create the local DataChannel:</li> </ol><figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> "https://rtc.live.cloudflare.com/v1/apps/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/sessions/</span><span class="nb-shiki-140thh">$PUBLISHER_SESSION_ID</span><span class="nb-shiki-mdbnqw">/datachannels/new"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$APP_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> @-</span><span class="nb-shiki-1itgoe"> &lt;&lt;</span><span class="nb-shiki-mdbnqw">EOF</span></span> <span class="line"><span class="nb-shiki-mdbnqw">{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "dataChannels": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "location": "local",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "dataChannelName": "player-state",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ordered": false,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "maxRetransmits": 0</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}</span></span> <span class="line"><span class="nb-shiki-mdbnqw">EOF</span></span></code></pre></figure><ol start="2"> <li>On each subscriber session, pull the remote DataChannel with the same delivery settings:</li> </ol><figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> "https://rtc.live.cloudflare.com/v1/apps/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/sessions/</span><span class="nb-shiki-140thh">$SUBSCRIBER_SESSION_ID</span><span class="nb-shiki-mdbnqw">/datachannels/new"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$APP_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> @-</span><span class="nb-shiki-1itgoe"> &lt;&lt;</span><span class="nb-shiki-mdbnqw">EOF</span></span> <span class="line"><span class="nb-shiki-mdbnqw">{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "dataChannels": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "location": "remote",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "sessionId": "</span><span class="nb-shiki-140thh">$PUBLISHER_SESSION_ID</span><span class="nb-shiki-mdbnqw">",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "dataChannelName": "player-state",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ordered": false,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "maxRetransmits": 0</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}</span></span> <span class="line"><span class="nb-shiki-mdbnqw">EOF</span></span></code></pre></figure><ol start="3"> <li>In the publisher and subscriber clients, create the negotiated browser DataChannel with the same settings. In this example, <code>pc</code> is the active <code>RTCPeerConnection</code>, and <code>channelId</code> is the ID returned by the corresponding API request:</li> </ol><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> channel</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> pc.</span><span class="nb-shiki-1t8gfj">createDataChannel</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"player-state"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> negotiated: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> id: channelId,</span></span> <span class="line"><span class="nb-shiki-140thh"> ordered: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> maxRetransmits: </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/steps/Steps.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="related-documentation">Related documentation</h4><a class="anchor-link" href="#related-documentation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/realtime/sfu/">Realtime SFU overview</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/datachannels/">DataChannels</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/https-api/">Connection API</a></li> </ul>Thu, 13 Aug 2026 00:00:00 GMTRealtimeRealtimeSSL/TLS - Certificate Transparency Monitoring is now Generally Availablehttps://developers.cloudflare.com/changelog/post/2026-08-13-ct-monitoring-ga/https://developers.cloudflare.com/changelog/post/2026-08-13-ct-monitoring-ga/<p>Certificate Transparency Monitoring is now <a href="https://blog.cloudflare.com/certificate-transparency-monitoring-ga" target="_blank" rel="noopener">generally available<span class="external-link"> ↗</span></a> across all Cloudflare plans.</p> <p>Alerts for certificates Cloudflare issues on your behalf (Universal SSL renewals, backup certificates, Advanced Certificate Manager, Total TLS) are now automatically filtered out. Alert emails are also clearer and more actionable, with structured certificate details and a direct link to manage CT Monitoring in the Cloudflare dashboard.</p> <p>Learn more in the <a href="https://blog.cloudflare.com/certificate-transparency-monitoring-ga" target="_blank" rel="noopener">launch blog post<span class="external-link"> ↗</span></a> or the <a href="https://developers.cloudflare.com/ssl/edge-certificates/additional-options/certificate-transparency-monitoring/">CT Monitoring docs</a>.</p>Thu, 13 Aug 2026 00:00:00 GMTSSL/TLSSSL/TLSEmail security - Block emails by content with blocked content ruleshttps://developers.cloudflare.com/changelog/post/2026-08-12-blocked-content-rules/https://developers.cloudflare.com/changelog/post/2026-08-12-blocked-content-rules/<p>Cloudflare Email security now lets administrators write their own content-based blocking rules. A new <strong>Blocked content</strong> area under <strong>Policies &amp; rules</strong> lets you define a plaintext string or a regular expression, choose whether to scan the message subject, body, or both, and automatically block any message that matches.</p> <ul> <li>Create rules using either <strong>plaintext</strong> matches or <strong>regular expressions</strong> — useful for blocking targeted phishing campaigns, known-bad phrases, or content patterns unique to your organization.</li> <li>Choose the <strong>search location</strong> for each rule: <strong>subject</strong>, <strong>body</strong>, or <strong>subject and body</strong>.</li> <li>Use the built-in <strong>regular expression checker</strong> to validate your pattern against sample text before saving, so you can confirm the rule matches what you expect and avoid false positives.</li> <li>Matching messages are marked with a malicious <a href="https://developers.cloudflare.com/cloudflare-one/email-security/reference/dispositions-and-attributes/">disposition</a> and prevented from reaching users' inboxes.</li> </ul> <p>Blocked content rules currently only support the block action.</p> <p>This feature is available for the following Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/blocked-content/">Blocked content</a>.</p>Wed, 12 Aug 2026 09:00:00 GMTEmail securityEmail securityCloudflare One, Access - Independent MFA supports FIDO2 for infrastructure applicationshttps://developers.cloudflare.com/changelog/post/2026-08-12-fido2-keys-infrastructure-ssh/https://developers.cloudflare.com/changelog/post/2026-08-12-fido2-keys-infrastructure-ssh/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/">Infrastructure</a> applications support independent multi-factor authentication (MFA) with FIDO2 keys. You can allow <code>ssh_fido2_key</code>, <code>piv_key</code>, or both in application-level and policy-level MFA settings.</p> <p>Users enroll FIDO2 keys through the App Launcher and connect with the generated SSH identity. FIDO2 keys for SSH are separate from browser-based WebAuthn security keys and Personal Identity Verification (PIV) keys.</p> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#enroll-a-fido2-key-for-infrastructure-apps">Enroll a FIDO2 key for infrastructure apps</a> and <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/mfa-requirements/#infrastructure-applications">Configure MFA for infrastructure applications</a>.</p>Wed, 12 Aug 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessGateway, Cloudflare One - MCP protocol detection and AI Security dashboardhttps://developers.cloudflare.com/changelog/post/2026-08-12-mcp-detection-and-dashboard/https://developers.cloudflare.com/changelog/post/2026-08-12-mcp-detection-and-dashboard/<p>Cloudflare Gateway now automatically detects <a href="https://www.cloudflare.com/learning/ai/what-is-model-context-protocol-mcp/" target="_blank" rel="noopener">Model Context Protocol (MCP)<span class="external-link"> ↗</span></a> traffic flowing through your network. MCP is the standard protocol used by AI agents to connect to external tools and data sources. Gateway identifies MCP requests by inspecting protocol-specific headers and payload characteristics.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-policy-selector">MCP policy selector</h4><a class="anchor-link" href="#mcp-policy-selector"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <strong>Is MCP</strong> selector (<code>experimental.is_mcp</code>) is available in <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#is-mcp">HTTP policies</a>. Use this selector to build Gateway rules that allow, block, or isolate MCP traffic.</p> <p>This selector is currently in beta and may change before general availability.</p> <p>For example, the following policy blocks MCP traffic that does not arrive through an approved <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP portal</a>:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Selector</th> <th>Operator</th> <th>Value</th> <th>Logic</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td>Is MCP</td> <td>is</td> <td><em>True</em></td> <td>And</td> <td>Block</td> </tr> <tr> <td>Traffic Source</td> <td>is not</td> <td><em>MCP portal</em></td> <td></td> <td></td> </tr> </tbody> </table></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1104,height=664,format=webp/_astro/gateway-block-unknown-mcp.B2Ainj8x.png" alt="Example Gateway policy that blocks MCP traffic not arriving through an MCP portal" loading="lazy" decoding="async" width="1104" height="664"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-security-report">AI security report</h4><a class="anchor-link" href="#ai-security-report"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <strong>AI security report</strong> dashboard under <strong>Insights &amp; Logs &gt; Dashboards</strong> provides visibility into MCP usage across your organization. The dashboard includes:</p> <ul> <li>Total MCP request volume, unique users, and unique MCP servers</li> <li>A timeseries chart of unique MCP servers observed over time</li> <li>A summary of Gateway policies that target MCP traffic</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2406,height=928,format=webp/_astro/gateway-mcp-dashboard.C9jPahkp.png" alt="AI security report dashboard showing MCP detection data including total MCP requests, users, servers, and Gateway policies for MCP" loading="lazy" decoding="async" width="2406" height="928"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP policies</a>.</p>Wed, 12 Aug 2026 00:00:00 GMTGatewayGatewayCloudflare OneGateway, Cloudflare One - Traffic Source selector in Gateway policieshttps://developers.cloudflare.com/changelog/post/2026-08-12-traffic-source-selector/https://developers.cloudflare.com/changelog/post/2026-08-12-traffic-source-selector/<p>Gateway <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP</a> and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network</a> policies now include a <strong>Traffic Source</strong> selector that identifies how traffic reaches Cloudflare. This allows administrators to write policies that target specific on-ramp methods - for example, applying different rules to traffic arriving via the Cloudflare One Client compared to traffic routed through an MCP portal or a proxy endpoint.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="available-traffic-source-values">Available traffic source values</h4><a class="anchor-link" href="#available-traffic-source-values"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>UI name</th> <th>API value</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>Device client</td> <td><code>device_client</code></td> <td>Traffic from the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare One Client (WARP)</a></td> </tr> <tr> <td>Mesh</td> <td><code>mesh</code></td> <td>Traffic from a <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> connector</td> </tr> <tr> <td>Cloudflare WAN</td> <td><code>cloudflare_wan</code></td> <td>Traffic from <a href="https://developers.cloudflare.com/cloudflare-wan/zero-trust/cloudflare-gateway/">Cloudflare WAN</a> (Magic WAN)</td> </tr> <tr> <td>Clientless RDP</td> <td><code>clientless_rdp</code></td> <td>Traffic from a clientless RDP session</td> </tr> <tr> <td>Proxy endpoint</td> <td><code>proxy_endpoint</code></td> <td>Traffic from a <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/">proxy endpoint</a> (PAC file)</td> </tr> <tr> <td>Clientless Browser Isolation</td> <td><code>agentless_biso</code></td> <td>Traffic from <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">clientless Browser Isolation</a></td> </tr> <tr> <td>MCP portal</td> <td><code>mcp_portal</code></td> <td>Traffic from an <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP portal</a></td> </tr> </tbody> </table></div> <p>The selector uses the <code>net.onramp.type</code> API field in both HTTP and Network policies.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>UI name</th> <th>API example</th> </tr> </thead> <tbody> <tr> <td>Traffic Source</td> <td><code>net.onramp.type == "device_client"</code></td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="browser-isolation-selector">Browser Isolation selector</h4><a class="anchor-link" href="#browser-isolation-selector"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A <strong>Browser Isolation</strong> selector is also available in Network and HTTP policies. This selector identifies whether the current session is running inside <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">Remote Browser Isolation</a>, allowing administrators to apply different policy behavior to isolated traffic.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>UI name</th> <th>API example</th> </tr> </thead> <tbody> <tr> <td>Browser Isolation</td> <td><code>net.is_isolated == true</code></td> </tr> </tbody> </table></div> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP policies</a> and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network policies</a>.</p>Wed, 12 Aug 2026 00:00:00 GMTGatewayGatewayCloudflare OnePages - Pages now skips superseded queued buildshttps://developers.cloudflare.com/changelog/post/2026-08-11-skip-superseded-builds/https://developers.cloudflare.com/changelog/post/2026-08-11-skip-superseded-builds/<p>Pages now automatically skips a queued build when a newer build for the same project, branch, and deployment target is also queued.</p>Tue, 11 Aug 2026 00:00:00 GMTPagesPagesSupport - New Cloudflare Status pagehttps://developers.cloudflare.com/changelog/post/2026-08-11-new-status-page/https://developers.cloudflare.com/changelog/post/2026-08-11-new-status-page/<p>The Cloudflare Status page at <a href="https://www.cloudflarestatus.com/" target="_blank" rel="noopener">www.cloudflarestatus.com<span class="external-link"> ↗</span></a> has been rebuilt. It is available at the same address, and every previously documented <a href="https://www.cloudflarestatus.com/api" target="_blank" rel="noopener">Status API<span class="external-link"> ↗</span></a> endpoint remains supported, so existing bookmarks, integrations, and monitoring continue to work.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="notifications-that-fire-even-when-cloudflare-is-down">Notifications that fire even when Cloudflare is down</h4><a class="anchor-link" href="#notifications-that-fire-even-when-cloudflare-is-down"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The status page now has its own notification system, delivered independently of Cloudflare infrastructure. You can subscribe by email, webhook, Slack, Discord, or Google Chat.</p> <p>The <strong>Maintenance Notification</strong> and <strong>Incident Alerts</strong> in <a href="https://developers.cloudflare.com/notifications/">Cloudflare Notifications</a> remain supported, and deliver to the destinations already configured on your account.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="markdown-for-ai-agents">Markdown for AI agents</h4><a class="anchor-link" href="#markdown-for-ai-agents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Every page on the status page returns Markdown when requested with an <code>Accept: text/markdown</code> header, so agents can read the current status without parsing HTML:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: text/markdown"</span><span class="nb-shiki-mdbnqw"> https://www.cloudflarestatus.com/locations</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="separate-feeds-for-incidents-and-maintenance">Separate feeds for incidents and maintenance</h4><a class="anchor-link" href="#separate-feeds-for-incidents-and-maintenance"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Incidents and maintenance are published as separate feeds, each available in RSS and Atom, so you can subscribe to one without the other:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://www.cloudflarestatus.com/api/v3/incidents.rss</span></span> <span class="line"><span class="nb-shiki-wvjl67">https://www.cloudflarestatus.com/api/v3/incidents.atom</span></span> <span class="line"><span class="nb-shiki-wvjl67">https://www.cloudflarestatus.com/api/v3/maintenance.rss</span></span> <span class="line"><span class="nb-shiki-wvjl67">https://www.cloudflarestatus.com/api/v3/maintenance.atom</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/support/cloudflare-status/">Cloudflare Status</a>.</p>Tue, 11 Aug 2026 00:00:00 GMTSupportSupportCloudflare Tunnel, Cloudflare Tunnel for SASE, Cloudflare Mesh, Gateway, Cloudflare One - Hostname routing is now generally available, with a new public IP range for initial resolved IPshttps://developers.cloudflare.com/changelog/post/2026-08-11-hostname-routing-ga-public-initial-resolved-ips/https://developers.cloudflare.com/changelog/post/2026-08-11-hostname-routing-ga-public-initial-resolved-ips/ <p><a href="https://blog.cloudflare.com/tunnel-hostname-routing/" target="_blank" rel="noopener">Hostname routing<span class="external-link"> ↗</span></a> is now generally available. Instead of managing static IP lists and routes, you can route traffic by hostname across multiple Cloudflare One connectors:</p> <ul> <li><strong>Cloudflare Tunnel</strong>: route a <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/">private hostname</a> (for example, <code>wiki.internal.local</code>) to a private application behind your tunnel, or a <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/">public hostname</a> (for example, <code>bank.example.com</code>) to egress through a specific tunnel and anchor traffic to a dedicated exit node.</li> <li><strong>Cloudflare Mesh</strong>: attract a <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes">private or public hostname's traffic</a> to a Mesh node.</li> </ul> <p>Alongside GA, the default IPv4 range used for <!-- prettier-ignore --><span id="initial resolved IP" data-tooltip data-content="<p>A unique, ephemeral IP address that Gateway assigns to DNS queries when filtering network traffic by hostname. The IP is randomly selected from an IPv4 range (<code>172.64.128.0/20</code> by default, configurable per account) or an IPv6 range (<code>2606:4700:0cf1:4000::/64</code>, not configurable).</p> " class="glossary-tooltip" tabindex="0" data-astro-cid-hklyqugd>initial resolved IPs</span><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/GlossaryTooltip.astro?astro&type=script&index=0&lang.ts"></script> (also called token IPs) is changing from a Carrier-Grade NAT (CGNAT) range to a public Cloudflare-owned range:</p><ul> <li><strong>IPv4</strong>: <code>172.64.128.0/20</code></li> <li><strong>IPv6</strong>: <code>2606:4700:0cf1:4000::/64</code></li> </ul> <p>This is the default range. You can <a href="https://developers.cloudflare.com/cloudflare-one/networks/routes/configure-initial-resolved-ips/">configure a custom initial resolved IP range</a> for IPv4 if it conflicts with your existing network.</p> <p><strong>Why this is changing:</strong> Starting with <a href="https://developer.chrome.com/release-notes/142" target="_blank" rel="noopener">Chrome 142<span class="external-link"> ↗</span></a>, Local Network Access (LNA) restrictions block background requests to CGNAT addresses (<code>100.64.0.0/10</code>), which included the previous initial resolved IP default (<code>100.80.0.0/16</code>). LNA is implemented at the Chromium engine level, so it affects all Chromium-based browsers (for example, Microsoft Edge, Brave, and Opera), not only Google Chrome. This could silently break hostname-based Gateway features for users of these browsers, and required Chrome Enterprise policy workarounds. The new default range is public Cloudflare address space, so it is not affected by this restriction.</p> <p><strong>What is affected:</strong> Initial resolved IPs are used by several features that associate a DNS query with the network connection that follows it:</p> <ul> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/">Private</a> and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/">public</a> hostname routing for Cloudflare Tunnel</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes">Hostname routes</a> for Cloudflare Mesh</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/">Access private applications</a> on non-HTTPS ports</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/host-selectors/">Egress policy host selectors</a> (Domain, Host, Application, and Content Categories)</li> </ul> <p>You can check your account's current range, or configure a custom range, at any time from <strong>Zero Trust</strong> &gt; <strong>Team &amp; Resources</strong> &gt; <strong>Devices</strong> &gt; <strong>Device profiles</strong>, or using the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/subnets/#(resource)%20zero_trust.networks.subnets.initial_resolved_ip">Initial Resolved IP Subnet API</a>.</p> <p>For full instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/routes/configure-initial-resolved-ips/">Configure initial resolved IPs</a>. The IPv6 range (<code>2606:4700:0cf1:4000::/64</code>) is unchanged and is not affected by this restriction.</p> <p>If you were relying on a Chrome Enterprise policy workaround (such as <code>LocalNetworkAccessRestrictionsTemporaryOptOut</code>) while your account was still on the legacy CGNAT-based range, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/#google-chrome-restricts-access-to-private-hostnames">Google Chrome restricts access to private hostnames</a> for next steps.</p>Tue, 11 Aug 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASECloudflare MeshGatewayCloudflare OneWAF - WAF Release - 2026-08-11https://developers.cloudflare.com/changelog/post/2026-08-11-waf-release/https://developers.cloudflare.com/changelog/post/2026-08-11-waf-release/ <p>This release introduces new protection for a remote code execution vulnerability in vBulletin and improves two existing detections.</p> <p><strong>Key Findings</strong></p> <ul> <li>A new detection provides protection against vBulletin CVE-2026-61511.</li> <li>Two existing detections have been improved to strengthen coverage.</li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of CVE-2026-61511 may lead to remote code execution on affected vBulletin systems, potentially resulting in unauthorized access, data exposure, service disruption, and broader compromise of the hosting environment. Administrators are strongly encouraged to apply vendor updates and recommended mitigations.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1b0775f0f092483387cfb23f94f3006b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...94f3006b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>vBulletin - Remote Code Execution - CVE:CVE-2026-61511</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="784d3824b6cf419db6af0b64098b749e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...098b749e</span></button></rule-id></td><td>N/A</td><td>Version Control - Information Disclosure - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "Version Control - Information Disclosure" (ID: <rule-id id="23548ee2b36547a1be09bb2c0550c529"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0550c529</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a561c9138b46470ca6db96edd56225d8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d56225d8</span></button></rule-id></td><td>N/A</td><td>vBulletin - Code Injection - Invalid image format - CVE:CVE-2019-17132 - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "vBulletin - Code Injection - Invalid image format - CVE:CVE-2019-17132" (ID: <rule-id id="5137834eb8634842852273a08fe9f1c7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8fe9f1c7</span></button></rule-id>)</td></tr></tbody></table>Tue, 11 Aug 2026 00:00:00 GMTWAFWAFCloudflare One Client - Cloudflare One Client for Windows (version 2026.6.905.0)https://developers.cloudflare.com/changelog/post/2026-08-10-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-08-10-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This hotfix addresses an uncommon and intermittent case on Windows devices where the device is unable to reconnect after the device is woken from sleep.</p> Mon, 10 Aug 2026 20:28:46 GMTCloudflare One ClientCloudflare One ClientCloudflare Tunnel, Cloudflare Tunnel for SASE - Stream live logs from Cloudflare Tunnel in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-08-10-tunnel-live-logs-core-dashboard/https://developers.cloudflare.com/changelog/post/2026-08-10-tunnel-live-logs-core-dashboard/ <p>Real-time Tunnel log streaming is now available in the Cloudflare dashboard under <strong>Networking</strong> &gt; <strong>Tunnels</strong>. This brings the same live debugging capability previously only available in the Cloudflare One dashboard, including multi-connector aggregated streaming for high-availability deployments.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=948,format=webp/_astro/tunnel-live-logs-core-dashboard.Dtm7Jg51.gif" alt="Stream live logs from a tunnel in the Cloudflare dashboard" loading="lazy" decoding="async" width="1800" height="948"> <p>In the tunnel detail view, a new <strong>Live logs</strong> tab lets you:</p> <ul> <li><strong>Stream logs from single or multiple connectors</strong> — In <a href="https://developers.cloudflare.com/tunnel/configuration/#replicas-and-high-availability">highly available</a> deployments with multiple <code>cloudflared</code> replicas, logs from all connectors are merged into a single stream grouped by hostname, making it easy to identify which host machine produced each log entry.</li> <li><strong>Filter by log level, event type, and HTTP method</strong> — Narrow the stream to only the events you care about (HTTP, TCP, UDP, or <code>cloudflared</code> internal), at any log level.</li> </ul> <a href="https://dash.cloudflare.com/?to=/:account/tunnels" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Tunnels</strong>&nbsp;&#8599;</a> <p>For more information, refer to <a href="https://developers.cloudflare.com/tunnel/monitoring/#remote-log-streaming">Monitor tunnels</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/monitor-tunnels/logs/">Tunnel log streams</a>.</p>Mon, 10 Aug 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASETurnstile - Turnstile Spin is now generally availablehttps://developers.cloudflare.com/changelog/post/2026-08-10-turnstile-spin-ga/https://developers.cloudflare.com/changelog/post/2026-08-10-turnstile-spin-ga/<p><a href="https://developers.cloudflare.com/turnstile/spin/">Turnstile Spin</a> is now generally available with three setup paths for creating a Turnstile widget and wiring canonical server-side siteverify into your existing backend. Start in the dashboard, with Wrangler, or from your AI coding agent. All three paths create the same widget. You can complete the integration by hand or have your agent embed the widget, wire siteverify, and validate it.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="server-side-verification">Server-side verification</h4><a class="anchor-link" href="#server-side-verification"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Turnstile setup has two parts: embed the widget in your frontend, then call siteverify from your backend. Without the second part, the widget appears on the page but does not protect the request.</p> <ul> <li>The skill includes insertion snippets for Next.js (App Router and Pages Router), Astro, SvelteKit, Hugo, and vanilla HTML. For other frameworks, the agent proposes a generic pattern and asks you to confirm it first.</li> <li>The Turnstile dashboard flags existing widgets with no matching siteverify traffic. Select <strong>Fix with Spin</strong> to copy a prompt that guides your agent through wiring siteverify into your backend.</li> <li>Before finishing, the agent runs a real Turnstile token through your protected endpoint, checks that it passes, then replays the token to confirm the endpoint rejects it on the second try. If a check fails, the agent stops and shows you where.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="run-spin">Run Spin</h4><a class="anchor-link" href="#run-spin"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can run Spin three ways:</p> <ul> <li>In the <strong>Turnstile dashboard</strong>, select <strong>Set up with Spin</strong>, enter your domains, then select <strong>Set up</strong>. Spin creates the widget and returns the sitekey, secret, and a prompt for your agent.</li> <li>From the <code>Wrangler CLI</code>, run <a href="https://developers.cloudflare.com/turnstile/spin/#set-up-from-the-wrangler-cli"><code>wrangler turnstile widget create</code></a>. Wrangler prints the sitekey and secret. You wire the frontend and siteverify by hand.</li> <li>From your <strong>AI coding agent</strong>, paste the <a href="https://developers.cloudflare.com/turnstile/spin/#set-up-from-an-ai-coding-agent">Spin prompt</a> into Claude Code, Cursor, Codex, OpenCode, or GitHub Copilot Chat. Your agent fetches the skill, creates the widget, then embeds it and wires siteverify.</li> </ul> <p>To get started, refer to the <a href="https://developers.cloudflare.com/turnstile/spin/">Turnstile Spin documentation</a>.</p>Mon, 10 Aug 2026 00:00:00 GMTTurnstileTurnstileAI Gateway, Workers AI - Workers AI and AI Gateway unify model access and billinghttps://developers.cloudflare.com/changelog/post/2026-08-07-workers-ai-unified-billing/https://developers.cloudflare.com/changelog/post/2026-08-07-workers-ai-unified-billing/ <p>Workers AI and AI Gateway now provide a unified path for accessing models and managing inference traffic. Use the same AI binding and REST API to call models hosted on Workers AI or by supported third-party providers, with AI Gateway providing observability, logging, caching, security, and billing controls.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="unified-entrypoints-and-observability">Unified entrypoints and observability</h4><a class="anchor-link" href="#unified-entrypoints-and-observability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://developers.cloudflare.com/ai-gateway/usage/worker-binding-methods/">AI binding</a> supports both Workers AI and third-party models through <code>env.AI.run()</code>. The <a href="https://developers.cloudflare.com/ai-gateway/usage/rest-api/">REST API</a> provides shared <code>/ai/</code> endpoints with Cloudflare authentication across providers.</p> <p>Route a Workers AI request through AI Gateway by specifying a gateway ID. Use <code>default</code> to automatically create a gateway on the first authenticated request, or specify an existing gateway to separate applications and workloads:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "@cf/zai-org/glm-5.2"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"What is the capital of France?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> gateway: { id: </span><span class="nb-shiki-mdbnqw">"default"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "@cf/zai-org/glm-5.2"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"What is the capital of France?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> gateway: { id: </span><span class="nb-shiki-mdbnqw">"default"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Requests routed through AI Gateway can be logged and included in analytics for request volume, errors, latency, token usage, and costs. You can also configure controls such as caching, rate limiting, and request retries on the gateway.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="unified-billing-and-higher-rate-limits">Unified billing and higher rate limits</h4><a class="anchor-link" href="#unified-billing-and-higher-rate-limits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now use prepaid <a href="https://developers.cloudflare.com/ai-gateway/features/unified-billing/">AI Gateway credits</a> to pay for Workers AI inference. This provides one credit balance for Workers AI and supported third-party model providers. To use credits for Workers AI, set the gateway's <a href="https://developers.cloudflare.com/ai-gateway/configuration/manage-gateway/#configure-workers-ai-billing">Workers AI billing setting</a> to <strong>Unified billing</strong>. Workers AI requests routed through that gateway deduct from your credit balance in real time.</p> <p>Prepaid credits also provide access to the following Workers AI frontier models without requiring the Workers Paid plan. Each frontier Workers AI model has a rate limit of 50 requests per minute per account, per model when billed with AI Gateway credits, compared to 20 requests per minute through standard Workers AI billing:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/"><code>@cf/moonshotai/kimi-k2.6</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/"><code>@cf/moonshotai/kimi-k2.7-code</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/glm-5.2/"><code>@cf/zai-org/glm-5.2</code></a></li> </ul> <p>These limits are designed for typical agentic and coding workloads, where requests to frontier models can take longer to complete.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/workers-ai/platform/limits/">Workers AI limits</a>, <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">Workers AI pricing</a>, <a href="https://developers.cloudflare.com/ai-gateway/features/unified-billing/">Unified Billing</a>, and the <a href="https://developers.cloudflare.com/ai/models/">AI Gateway model catalog</a>.</p>Fri, 07 Aug 2026 00:00:00 GMTAI GatewayAI GatewayWorkers AIHyperdrive - MySQL support in Hyperdrive is now generally availablehttps://developers.cloudflare.com/changelog/post/2026-08-07-hyperdrive-mysql-ga/https://developers.cloudflare.com/changelog/post/2026-08-07-hyperdrive-mysql-ga/ <p>Support for MySQL in Hyperdrive is now generally available. You can connect to any MySQL database from your Workers using Hyperdrive.</p> <p>Hyperdrive makes your regional, MySQL databases fast when connecting from Cloudflare Workers. It eliminates unnecessary network roundtrips during connection setup, pools database connections globally, and can cache query results to provide the fastest possible response times.</p> <p>You can connect using your existing drivers, ORMs, and query builders with Hyperdrive's secure credentials, with no code changes required. MySQL support is available at the same <a href="https://developers.cloudflare.com/hyperdrive/platform/pricing/">pricing</a> as Postgres.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createConnection } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "mysql2/promise"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> connection</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> createConnection</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> host: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.host,</span></span> <span class="line"><span class="nb-shiki-140thh"> user: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.user,</span></span> <span class="line"><span class="nb-shiki-140thh"> password: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.password,</span></span> <span class="line"><span class="nb-shiki-140thh"> database: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.database,</span></span> <span class="line"><span class="nb-shiki-140thh"> port: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.port,</span></span> <span class="line"><span class="nb-shiki-140thh"> disableEval: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Required for Workers compatibility</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-dzsirb">results</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">fields</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> connection.</span><span class="nb-shiki-1t8gfj">query</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"SHOW tables;"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> ctx.</span><span class="nb-shiki-1t8gfj">waitUntil</span><span class="nb-shiki-140thh">(connection.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">());</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({ results, fields }), {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"application/json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Access-Control-Allow-Origin"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"*"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createConnection } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "mysql2/promise"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> HYPERDRIVE</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Hyperdrive</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> connection</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> createConnection</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> host: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.host,</span></span> <span class="line"><span class="nb-shiki-140thh"> user: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.user,</span></span> <span class="line"><span class="nb-shiki-140thh"> password: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.password,</span></span> <span class="line"><span class="nb-shiki-140thh"> database: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.database,</span></span> <span class="line"><span class="nb-shiki-140thh"> port: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.port,</span></span> <span class="line"><span class="nb-shiki-140thh"> disableEval: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Required for Workers compatibility</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-dzsirb">results</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">fields</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> connection.</span><span class="nb-shiki-1t8gfj">query</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"SHOW tables;"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> ctx.</span><span class="nb-shiki-1t8gfj">waitUntil</span><span class="nb-shiki-140thh">(connection.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">());</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({ results, fields }), {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"application/json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Access-Control-Allow-Origin"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"*"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Learn more about <a href="https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/">how Hyperdrive works</a> and <a href="https://developers.cloudflare.com/hyperdrive/get-started/">get started building Workers that connect to MySQL with Hyperdrive</a>.</p>Fri, 07 Aug 2026 00:00:00 GMTHyperdriveHyperdriveCloudflare Mesh, Cloudflare One - Container image for Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-08-07-mesh-container-image/https://developers.cloudflare.com/changelog/post/2026-08-07-mesh-container-image/ <p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes can now run as Docker containers. The <a href="https://hub.docker.com/r/cloudflare/mesh" target="_blank" rel="noopener"><code>cloudflare/mesh</code><span class="external-link"> ↗</span></a> image is available on Docker Hub for Docker Compose, Kubernetes, and any OCI-compatible runtime — no host-level package installation required.</p> <p>The image supports <code>amd64</code> and <code>arm64</code> architectures and includes built-in <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/containers/#source-nat">source NAT</a> so return traffic routes correctly without VPC route table changes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deployment-patterns">Deployment patterns</h4><a class="anchor-link" href="#deployment-patterns"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Docker Compose</strong> — add a <code>cloudflare-mesh</code> service to your <code>compose.yaml</code> and connect your entire stack to a private network.</li> <li><strong>Kubernetes StatefulSet</strong> — deploy a standalone Mesh node with persistent registration state.</li> <li><strong>Kubernetes sidecar</strong> — add the Mesh image as a sidecar container in a Pod to connect an application to Cloudflare without application changes.</li> <li><strong>CI/CD</strong> — pull the image in a pipeline step, join the Mesh, run integration tests against private infrastructure, and tear down. The node disappears when the container exits.</li> </ul> <p>For <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/">high availability</a>, run multiple replicas with the same Mesh node token. Cloudflare operates replicas in active-passive mode with automatic failover.</p> <a href="https://dash.cloudflare.com/?to=/:account/mesh" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Mesh</strong>&nbsp;&#8599;</a> <p>For setup steps, runtime configuration, and deployment examples, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/containers/">Run Mesh in Docker / Kubernetes</a>.</p>Fri, 07 Aug 2026 00:00:00 GMTCloudflare MeshCloudflare MeshCloudflare OneRadar - AS-level connectivity and upstream providers on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-08-07-radar-as-connectivity-upstreams/https://developers.cloudflare.com/changelog/post/2026-08-07-radar-as-connectivity-upstreams/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> expands its <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Routing section<span class="external-link"> ↗</span></a> with two widgets on AS pages, such as <a href="https://radar.cloudflare.com/routing/as13335" target="_blank" rel="noopener">AS13335<span class="external-link"> ↗</span></a>, that describe how a network reaches the rest of the Internet: the paths it takes toward the <a href="https://en.wikipedia.org/wiki/Tier_1_network" target="_blank" rel="noopener">Tier-1<span class="external-link"> ↗</span></a> networks, and the mix of direct upstreams carrying its routes. Both are derived from <a href="https://www.routeviews.org/" target="_blank" rel="noopener">RouteViews<span class="external-link"> ↗</span></a> RIB snapshots, unioned across selected collectors.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="as-level-connectivity">AS-level connectivity</h4><a class="anchor-link" href="#as-level-connectivity"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>AS-level connectivity</strong> graph aggregates the BGP paths an AS uses to reach the Tier-1 networks, unioned across all the prefixes it announces, as observed by selected RouteViews collectors. It reads from left to right, starting at the queried AS and ending at the Tier-1 networks, and each node is labeled with its AS number, country, and organization name. Tier-1 nodes are marked so they stand apart from the intermediate networks that lead to them.</p> <p>By default, the graph shows the network's direct connections to Tier-1 networks plus the indirect paths, which keeps the view readable. A <strong>Show full paths</strong> toggle expands it to every observed path, including transit through Tier-1 networks the AS already connects to. An IP version selector switches between IPv4 and IPv6, because the paths reaching Tier-1 networks may differ between the two address families.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1526,format=webp/_astro/as-level-connectivity-graph.DGv8lrUx.png" alt="AS-level connectivity graph for AS13335, showing Tier-1 networks it reaches directly alongside paths that reach others through intermediate networks" loading="lazy" decoding="async" width="1600" height="1526"> <p>This is the AS-level counterpart to the <strong>Real-time connectivity</strong> graph on prefix pages, such as the one for <a href="https://radar.cloudflare.com/routing/prefix/1.1.1.0/24" target="_blank" rel="noopener">1.1.1.0/24<span class="external-link"> ↗</span></a>. Instead of covering a single prefix, it covers the union of paths for all prefixes an AS announces, which makes it a fast way to read a network's transit hierarchy: which providers it depends on, how many hops separate it from the core, and whether its paths to the core are diverse or concentrated. For more information on the prefix-level graph, refer to <a href="https://developers.cloudflare.com/radar/glossary/#bgp-real-time-routes">BGP real-time routes</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upstream-providers">Upstream providers</h4><a class="anchor-link" href="#upstream-providers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Upstream providers</strong> widget tracks the share of an AS's observed paths carried by each of its direct upstream networks over time, drawn as a stacked area chart. Up to 10 upstreams appear as their own series and the remaining ones are grouped into <strong>Other</strong>. Transit changes such as adding a provider, dropping one, or moving traffic between them appear as movement between bands rather than as a single aggregate number. As with the connectivity graph, an IP version selector switches between IPv4 and IPv6.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=976,format=webp/_astro/as-upstream-providers-timeseries.BUc6CJaT.png" alt="Stacked area chart of the share of AS13335's observed paths carried by each of its top 10 direct upstreams, with the remainder grouped into Other" loading="lazy" decoding="async" width="1600" height="976"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-endpoints">API endpoints</h4><a class="anchor-link" href="#api-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The data behind both widgets is also available through two new endpoints on the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/"><code>BGP</code></a> API:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/routes/subresources/paths/methods/list/"><code>/bgp/routes/paths/{asn}</code></a> — Returns the ordered AS path segments an AS uses to reach the Tier-1 networks, each with its observed path count, peer count, and contributing collectors, alongside the name and country of every ASN in the response. Pass <code>collector</code> to scope the result to a single RouteViews collector.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/routes/subresources/upstreams/methods/timeseries/"><code>/bgp/routes/upstreams/{asn}/timeseries</code></a> — Returns the share of an AS's observed paths carried by each direct upstream over time. Use <code>limit</code> to control how many upstreams come back as separate series before the rest are grouped into an <code>OTHER</code> series, and <code>ipVersion</code> to select the address family.</li> </ul> <p>Visit the <a href="https://radar.cloudflare.com/routing/as13335" target="_blank" rel="noopener">AS13335 routing page<span class="external-link"> ↗</span></a> to explore both widgets, or swap in any other AS number.</p>Fri, 07 Aug 2026 00:00:00 GMTRadarRadarRadar - Radar Researcher beta and WebMCP support now availablehttps://developers.cloudflare.com/changelog/post/2026-08-07-radar-researcher-and-webmcp/https://developers.cloudflare.com/changelog/post/2026-08-07-radar-researcher-and-webmcp/<p><a href="https://developers.cloudflare.com/radar/"><strong>Cloudflare Radar</strong></a> now includes <a href="https://radar.cloudflare.com/?prompt=" target="_blank" rel="noopener">Radar Researcher<span class="external-link"> ↗</span></a>, a beta AI-powered assistant for exploring Internet trends and traffic data in plain language. Open Researcher from the header on any Radar page to ask questions by voice or text, receive explanations, and view interactive charts based on Radar API data.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1430,height=780,format=webp/_astro/radar-researcher-panel.B7QqJlGo.webp" alt="Screenshot of the Radar Researcher panel alongside the Radar overview page" loading="lazy" decoding="async" width="1430" height="780"> <p>To ask about a specific chart, select <strong>Explain with AI</strong> to start a conversation with its underlying data and context.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=434,height=302,format=webp/_astro/radar-explain-with-ai.Dgw4ghVh.webp" alt="Screenshot of the Explain with AI option in a Radar chart menu" loading="lazy" decoding="async" width="434" height="302"> <p>You can explore further with suggested follow-up questions, find earlier conversations through searchable history, and share conversations through shareable links.</p> <p>Alongside the user-facing Researcher experience, Radar now supports <a href="https://developers.cloudflare.com/browser-run/features/webmcp/">WebMCP</a>, allowing browser-based AI agents to navigate Radar, search data, and use tools such as URL scanning and domain lookup.</p> <p>To get started, visit <a href="https://radar.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a>.</p>Fri, 07 Aug 2026 00:00:00 GMTRadarRadarSandbox SDK - Sandbox SDK 1.0 preview on @nexthttps://developers.cloudflare.com/changelog/post/2026-08-07-sandbox-sdk-1-0-preview/https://developers.cloudflare.com/changelog/post/2026-08-07-sandbox-sdk-1-0-preview/ <p><strong>Sandbox SDK 1.0</strong> is available to preview under the npm <code>@next</code> tag. For existing applications, the current stable package remains published on the 0.12.x line.</p> <p>Sandbox SDK first shipped to provide a rich library for running untrusted and agent-driven work on <a href="https://developers.cloudflare.com/containers/">Cloudflare Containers</a>. Since then, both Sandbox and Containers have matured. This preview is a thinner SDK built on a richer Cloudflare Containers foundation.</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-npm" id="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-yarn" id="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-pnpm" id="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-bun" id="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-npm" aria-labelledby="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i @cloudflare/sandbox@next</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i @cloudflare/sandbox@next" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-yarn" aria-labelledby="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add @cloudflare/sandbox@next</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add @cloudflare/sandbox@next" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-pnpm" aria-labelledby="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add @cloudflare/sandbox@next</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add @cloudflare/sandbox@next" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-43083a29-37d3-4e28-a046-2f9057847a10-bun" aria-labelledby="pm-tab-pm-43083a29-37d3-4e28-a046-2f9057847a10-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add @cloudflare/sandbox@next</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add @cloudflare/sandbox@next" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-this-preview-is">What this preview is</h4><a class="anchor-link" href="#what-this-preview-is"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>A single execution interface</strong> — <code>sandbox.exec()</code> takes an argument list, returns when the process <strong>starts</strong>, and gives you a handle for output, logs, waits, and signals. Both short commands and long-running services use the same API.</li> <li><strong>Removed session execution</strong> — the SDK no longer maintains shell state between executions. Each launch is independent. Pass <code>cwd</code> and <code>env</code> when you need them, or put multi-step shell syntax in one explicit shell command.</li> <li><strong>RPC as the only transport</strong> — the SDK talks to the container exclusively over RPC. Remove <code>SANDBOX_TRANSPORT</code>, <code>transport</code> on <code>getSandbox()</code>, and <code>setTransport()</code>.</li> <li><strong>Improved PTY and terminal interface</strong> — interactive PTYs use <code>createTerminal</code> / <code>connect</code>, not the older session-shaped helpers.</li> <li><strong>Code interpreter as an extension</strong> — configure the code interpreter on your <code>Sandbox</code> subclass so you only ship what you need.</li> </ul> <p>Start new projects on <code>@next</code>. Migrate existing apps when you can so you are ready when 1.0 becomes stable. Deploy the Worker package and container image from the <strong>same</strong> <code>@next</code> line.</p> <p>Coding agents: install <a href="https://github.com/cloudflare/skills" target="_blank" rel="noopener">Cloudflare Skills<span class="external-link"> ↗</span></a> (<a href="https://developers.cloudflare.com/agent-setup/">Agent setup</a>). Use <strong><code>sandbox-next</code></strong> for <code>@next</code> (recommended for new projects), <strong><code>sandbox-stable</code></strong> for the current stable package, and <strong><code>sandbox-migrate-to-next</code></strong> when you are ready to port. Stable-package deprecated-API cleanup is in the <a href="https://developers.cloudflare.com/sandbox/guides/2026-deprecation/">2026 deprecation guide</a>.</p> <p>The main <a href="https://developers.cloudflare.com/sandbox/">Sandbox documentation</a> still describes today's stable package. Preview docs:</p> <ul> <li><a href="https://developers.cloudflare.com/sandbox/1-0-preview/">1.0 preview</a></li> <li><a href="https://developers.cloudflare.com/sandbox/1-0-preview/get-started/">Get started</a></li> <li><a href="https://developers.cloudflare.com/sandbox/1-0-preview/migrate/">Migrate</a></li> <li><a href="https://developers.cloudflare.com/sandbox/1-0-preview/processes/">Processes</a> · <a href="https://developers.cloudflare.com/sandbox/1-0-preview/terminals/">Terminals</a> · <a href="https://developers.cloudflare.com/sandbox/1-0-preview/errors/">Errors</a></li> <li><a href="https://developers.cloudflare.com/sandbox/1-0-preview/api/">API reference</a></li> </ul> <p>The self-deployed Sandbox bridge is not currently part of this preview. We are working on bringing it in line with the latest code. Until then, use the <a href="https://developers.cloudflare.com/sandbox/bridge/">stable bridge</a> with the matching stable package and container image.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="timeline-for-10">Timeline for 1.0</h4><a class="anchor-link" href="#timeline-for-10"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Further Cloudflare Containers features will let us keep reducing the size of the Sandbox SDK. We aim to ship Sandbox SDK 1.0 once those are in. In the meantime we continue to support and maintain the 1.0 preview (<code>@next</code>) alongside the current stable release.</p>Fri, 07 Aug 2026 00:00:00 GMTSandbox SDKSandbox SDKWAF - WAF Release - 2026-08-07https://developers.cloudflare.com/changelog/post/2026-08-07-waf-release/https://developers.cloudflare.com/changelog/post/2026-08-07-waf-release/ <p>This release updates WordPress XSS rule metadata in the Cloudflare Managed Ruleset and Cloudflare Free Ruleset to identify XSS2Shell (CVE-2026-64638). It also disables the Command Injection - Obfuscation rule.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-64638: A pre-authentication reflected cross-site scripting vulnerability affecting the WordPress login screen. Exploitation requires social engineering and explicit interaction by the target user. Under additional conditions, it may be escalated to remote code execution.</li> </ul> <p><strong>Impact</strong></p> <p>The WordPress changes update rule metadata only; detection behavior and actions remain unchanged.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d3852d0891634686a46114069c6dff1c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9c6dff1c</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Wordpress - XSS - CVE:CVE-2026-64638</td><td>Block</td><td>N/A</td><td>Rule metadata description refined. Detection unchanged.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="5bdf578fff504b8cbe3b7f699ab5ed95"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9ab5ed95</span></button></rule-id></td><td>N/A</td><td>Wordpress - XSS - CVE:CVE-2026-64638</td><td>Block</td><td>N/A</td><td>Rule metadata description refined. Detection unchanged.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="95a84ab1645a49c685648c17761e7a4c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...761e7a4c</span></button></rule-id></td><td>N/A</td><td>Command Injection - Obfuscation</td><td>Block</td><td>Disabled</td><td>Detection logic has been deprecated</td></tr></tbody></table>Fri, 07 Aug 2026 00:00:00 GMTWAFWAFAI Search - AI Search makes it easier to build a search engine for your datahttps://developers.cloudflare.com/changelog/post/2026-08-06-public-endpoint-custom-domains-and-namespaces/https://developers.cloudflare.com/changelog/post/2026-08-06-public-endpoint-custom-domains-and-namespaces/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> gets you from a data source to a working search endpoint quickly. This release adds what you need to put that endpoint in front of real users: your own domain, authentication, and one endpoint across several instances. It also adds crawling for sites without a complete sitemap, so your index covers everything you want it to find.</p> <p>Each of the following is a new option. The previous behavior is still the default, so nothing changes until you change it.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="serve-search-from-your-own-domain">Serve search from your own domain</h4><a class="anchor-link" href="#serve-search-from-your-own-domain"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/">public endpoint</a> is a URL that a site or app can query directly, with no authentication in front of it. By default that URL is a generated hostname on <code>search.ai.cloudflare.com</code>. You can now serve the same endpoint from a <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/custom-domains/">custom domain</a>, a hostname in a zone that you own:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://search.example.com/search</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="restrict-who-can-query-your-content">Restrict who can query your content</h4><a class="anchor-link" href="#restrict-who-can-query-your-content"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Once your endpoint is on your own domain, you can put <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/cloudflare-access/">Cloudflare Access</a> in front of it. For example, you usually want to give <code>/mcp</code> to specific agents rather than to anyone who finds the URL. Agents authenticate with an Access service token, and people who open the endpoint in a browser sign in through your identity provider.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="search-several-instances-from-one-url">Search several instances from one URL</h4><a class="anchor-link" href="#search-several-instances-from-one-url"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A namespace can expose its own <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/namespace/">public endpoint</a> with <code>/search</code>, <code>/chat/completions</code>, and <code>/mcp</code> paths that fan out across the instances you choose:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://ns-</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">NAMESPACE_ENDPOINT_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">.search.ai.cloudflare.com/search</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [{ "content": "How do I configure AI Search?", "role": "user" }],</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ai_search_options": { "instance_ids": ["docs", "support"] }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="index-your-sites-without-a-sitemap">Index your sites without a sitemap</h4><a class="anchor-link" href="#index-your-sites-without-a-sitemap"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Website data sources support a new <code>discover</code> <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/">parse type</a>. It starts at the source URL and collects pages from both your sitemaps and the links it finds while crawling:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/&lt;ACCOUNT_ID&gt;/ai-search/instances"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "id": "my-ai-search",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "web-crawler",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source": "example.com",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source_params": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "web_crawler": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "parse_type": "discover",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "discover_options": { "source": "links", "limit": 5000, "depth": 3 }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/ai-search/">AI Search documentation</a>.</p>Thu, 06 Aug 2026 00:00:00 GMTAI SearchAI SearchBrowser Run - Introducing Kitesurf, an agent-first browser on Browser Runhttps://developers.cloudflare.com/changelog/post/2026-08-06-kitesurf/https://developers.cloudflare.com/changelog/post/2026-08-06-kitesurf/<p><a href="https://developers.cloudflare.com/browser-run/kitesurf/">Kitesurf</a> is Cloudflare's new stateless, highly scalable browser that runs entirely on top of <a href="https://developers.cloudflare.com/workers/">Workers</a> and is designed for AI agents. It is available for free while in beta.</p> <p>Compared to Chromium, Kitesurf uses 3–7× less CPU and memory for common agentic tasks like screenshots and HTML extraction, so you can run more sessions and scale better for bursty, AI-driven workloads.</p> <p>Your existing clients already work. To opt in, add the <code>browser=kitesurf</code> parameter to any Browser Run <a href="https://developers.cloudflare.com/browser-run/cdp/">CDP</a> or <a href="https://developers.cloudflare.com/browser-run/quick-actions/">Quick Action</a> endpoint:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/&lt;ACCOUNT_ID&gt;/browser-run/screenshot?browser=kitesurf'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;API_TOKEN&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --output</span><span class="nb-shiki-mdbnqw"> "screenshot.png"</span></span></code></pre></figure> <p>You can also explore Kitesurf without writing any code in the <a href="https://kitesurf.cloudflare.app/" target="_blank" rel="noopener">public playground<span class="external-link"> ↗</span></a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/browser-run/kitesurf/">Kitesurf documentation</a> and the <a href="https://blog.cloudflare.com/kitesurf" target="_blank" rel="noopener">blog announcement<span class="external-link"> ↗</span></a>.</p>Thu, 06 Aug 2026 00:00:00 GMTBrowser RunBrowser RunAI Gateway - Track AI spend and catch anomalous usage with User Insightshttps://developers.cloudflare.com/changelog/post/2026-08-05-user-insights/https://developers.cloudflare.com/changelog/post/2026-08-05-user-insights/<p>AI Gateway now includes User Insights, a dashboard that gives you two things at once: clear visibility into how much your organization spends on AI, and a security signal that surfaces users whose usage suddenly looks abnormal. It works on the traffic already flowing through your gateway, so there is no additional setup.</p> <p>On the spend side, User Insights shows organization-wide totals for cost, requests, tokens, and adoption, and lets you drill into an individual user to see their spend, top models and providers, cache hit rate, and more. To attribute usage to individual users, add a user identifier with custom metadata or put your gateway behind Cloudflare Access.</p> <p>On the security side, User Insights baselines each user's normal usage from their 95th percentile (p95) session cost over the last 30 days, then flags sessions that exceed both that baseline and an organization-level threshold. A sudden jump above a user's own pattern is often the first sign of a compromised credential or a misbehaving agent, so you can investigate before it shows up on your bill.</p> <p>User Insights is available to all AI Gateway customers at no additional cost.</p>Wed, 05 Aug 2026 20:00:00 GMTAI GatewayAI GatewayAI Gateway, Access - Identity-aware controls are now available in AI Gatewayhttps://developers.cloudflare.com/changelog/post/2026-08-05-access-user-id-metadata/https://developers.cloudflare.com/changelog/post/2026-08-05-access-user-id-metadata/<p>AI Gateway now integrates with Cloudflare Access, giving you two new capabilities:</p> <ul> <li><strong>Protect your gateway endpoint.</strong> Put your AI Gateway behind Access so you can set policies that control who is allowed to call a specific gateway's endpoint.</li> <li><strong>Identity-aware controls.</strong> When traffic reaches AI Gateway through an Access-protected custom domain, AI Gateway can use the authenticated user's Access identity in logs, analytics, routing, and spend controls.</li> </ul> <p>With identity-aware controls, you can set spend limits by authenticated user, control which gateways different users can access, filter logs by user, and build policies without passing user IDs from the client application. AI Gateway adds the verified Access user ID to request metadata as <code>cf.user_id</code>.</p> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/ai-gateway/configuration/cloudflare-access/">Cloudflare Access</a>.</p>Wed, 05 Aug 2026 00:00:00 GMTAI GatewayAI GatewayAccessCloudflare Fundamentals - Improved publisher verification details on OAuth consent screenshttps://developers.cloudflare.com/changelog/post/2026-08-04-oauth-consent-shields/https://developers.cloudflare.com/changelog/post/2026-08-04-oauth-consent-shields/<p>OAuth consent screens now display a shield icon with explanatory text beneath the consent screen title. Each shield icon indicates who owns the application and whether its domain ownership is verified.</p> <ul> <li><strong>Green filled shield</strong>: Cloudflare owns and manages the application.</li> <li><strong>Blue outlined shield</strong>: A third-party application with verified ownership of its domain.</li> <li><strong>Amber filled shield</strong>: A third-party application without verified ownership of a domain.</li> </ul> <p>Domain verification only confirms that the application owner controls the displayed domain.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/oauth/authorizing-an-application/">Authorizing an application</a>.</p>Wed, 05 Aug 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsAgents, Workers - Agent traces for Think, Flue, and AI SDK instrumented by Agents SDKhttps://developers.cloudflare.com/changelog/post/2026-08-04-agent-tracing/https://developers.cloudflare.com/changelog/post/2026-08-04-agent-tracing/ <p>Agent tracing is now available for applications built with the Agents SDK. Traces show each agent turn alongside model calls, tool runs, approvals, token usage, and Workers runtime operations.</p> <p>Turn on Workers tracing in your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "observability"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "traces"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">observability</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">traces</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">enabled = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Think and Flue applications emit agent traces automatically. For direct AI SDK calls, wrap the AI SDK namespace once. <code>wrapAISDK()</code> supports AI SDK v6 and v7. This AI SDK v7 example also supplies the agent identity:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-dzsirb"> *</span><span class="nb-shiki-1itgoe"> as</span><span class="nb-shiki-140thh"> ai </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { wrapAISDK } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/observability/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tracedAI</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> wrapAISDK</span><span class="nb-shiki-140thh">(ai);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> tracedAI.</span><span class="nb-shiki-1t8gfj">generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"Find an available appointment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> runtimeContext: {</span></span> <span class="line"><span class="nb-shiki-140thh"> agentId: </span><span class="nb-shiki-mdbnqw">"booking-agent-production"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> conversationId: </span><span class="nb-shiki-mdbnqw">"conversation-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> telemetry: {</span></span> <span class="line"><span class="nb-shiki-140thh"> functionId: </span><span class="nb-shiki-mdbnqw">"booking-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> includeRuntimeContext: {</span></span> <span class="line"><span class="nb-shiki-140thh"> agentId: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> conversationId: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-dzsirb"> *</span><span class="nb-shiki-1itgoe"> as</span><span class="nb-shiki-140thh"> ai </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { wrapAISDK } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/observability/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tracedAI</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> wrapAISDK</span><span class="nb-shiki-140thh">(ai);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> tracedAI.</span><span class="nb-shiki-1t8gfj">generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"Find an available appointment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> runtimeContext: {</span></span> <span class="line"><span class="nb-shiki-140thh"> agentId: </span><span class="nb-shiki-mdbnqw">"booking-agent-production"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> conversationId: </span><span class="nb-shiki-mdbnqw">"conversation-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> telemetry: {</span></span> <span class="line"><span class="nb-shiki-140thh"> functionId: </span><span class="nb-shiki-mdbnqw">"booking-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> includeRuntimeContext: {</span></span> <span class="line"><span class="nb-shiki-140thh"> agentId: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> conversationId: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Message and tool payload recording is off by default. Turn it on only when the payloads are safe to store:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tracedAI</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> wrapAISDK</span><span class="nb-shiki-140thh">(ai, {</span></span> <span class="line"><span class="nb-shiki-140thh"> storeMessages: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> storeTools: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tracedAI</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> wrapAISDK</span><span class="nb-shiki-140thh">(ai, {</span></span> <span class="line"><span class="nb-shiki-140thh"> storeMessages: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> storeTools: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Open the <a href="https://dash.cloudflare.com/?to=/:account/agents" target="_blank" rel="noopener"><strong>Agents</strong> tab<span class="external-link"> ↗</span></a> in the Cloudflare dashboard to inspect sessions, replay conversations, and view trace waterfalls. For advanced setup, privacy controls, and trace structure, refer to <a href="https://developers.cloudflare.com/agents/runtime/operations/observability/tracing/">Agent tracing</a>.</p>Tue, 04 Aug 2026 00:00:00 GMTAgentsAgentsWorkersArtifacts, Workflows - Build and deploy Artifacts repos on every pushhttps://developers.cloudflare.com/changelog/post/2026-08-04-build-and-deploy-on-push/https://developers.cloudflare.com/changelog/post/2026-08-04-build-and-deploy-on-push/ <p>You can now run your CI/CD pipeline on your <a href="https://developers.cloudflare.com/artifacts/">Artifacts</a> repo by defining a CI <a href="https://developers.cloudflare.com/workflows/">Workflow</a> with the <a href="https://github.com/cloudflare/ci" target="_blank" rel="noopener">CI SDK<span class="external-link"> ↗</span></a>, automatically triggered on Artifacts push events.</p> <p>This allows you to:</p> <ul> <li>Automatically build and deploy application code stored in Artifacts.</li> <li>Run linting, type checking, tests, and other checks on every push.</li> <li>Reuse dependencies when the lockfile (i.e. <code>pnpm-lock.yaml</code>) has not changed.</li> <li>Stop deployment when a check or build fails.</li> <li>Restrict API token access to the deployment step.</li> <li>Deploy the output to a <a href="https://developers.cloudflare.com/workers/">Worker</a> or a <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/">Workers for Platforms</a> User Worker.</li> </ul> <p>Define your CI steps with <code>@cloudflare/ci</code>. Each <code>ci.runner()</code> spins up an isolated sandbox, and the <code>cache</code> option reuses installed dependencies across each sandboxed step in your CI job.</p> <p>Point <code>cache.inputs</code> at your lockfile (i.e. <code>pnpm-lock.yaml</code>, <code>bun.lock</code>), and the install step only runs again when that lockfile changes:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> deps</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ci.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"install"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> command: </span><span class="nb-shiki-mdbnqw">"bun install --frozen-lockfile"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: { inputs: [</span><span class="nb-shiki-mdbnqw">"package.json"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"bun.lock"</span><span class="nb-shiki-140thh">] },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">all</span><span class="nb-shiki-140thh">([</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"lint"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run lint"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run test"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"typecheck"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run typecheck"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"build"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run build"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">]);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"deploy"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun wrangler deploy"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> deps</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ci.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"install"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> command: </span><span class="nb-shiki-mdbnqw">"bun install --frozen-lockfile"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: { inputs: [</span><span class="nb-shiki-mdbnqw">"package.json"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"bun.lock"</span><span class="nb-shiki-140thh">] },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">all</span><span class="nb-shiki-140thh">([</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"lint"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run lint"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run test"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"typecheck"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run typecheck"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"build"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run build"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">]);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"deploy"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun wrangler deploy"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div></div> <p>To start the Workflow automatically after each push, add a <code>cf.artifacts.repo.pushed</code> trigger to your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "triggers"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "events"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf.artifacts.repo.pushed"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "filter"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "namespace"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"CI"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "repoName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-repo"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "target"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "scriptName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-ci-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "workflowName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"ci-workflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">type = </span><span class="nb-shiki-mdbnqw">"cf.artifacts.repo.pushed"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">filter</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> namespace = </span><span class="nb-shiki-mdbnqw">"CI"</span></span> <span class="line"><span class="nb-shiki-140thh"> repoName = </span><span class="nb-shiki-mdbnqw">"my-repo"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">target</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> scriptName = </span><span class="nb-shiki-mdbnqw">"my-ci-worker"</span></span> <span class="line"><span class="nb-shiki-140thh"> workflowName = </span><span class="nb-shiki-mdbnqw">"ci-workflow"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>To learn more, refer to <a href="https://developers.cloudflare.com/artifacts/guides/build-and-deploy-on-push/">Build and deploy Artifacts repos</a>.</p>Tue, 04 Aug 2026 00:00:00 GMTArtifactsArtifactsWorkflowsCloudflare Fundamentals - Create Free accounts from the dashboardhttps://developers.cloudflare.com/changelog/post/2026-08-04-free-dashboard-button/https://developers.cloudflare.com/changelog/post/2026-08-04-free-dashboard-button/<p>You can now create standalone Free accounts directly from the Cloudflare dashboard using the new <strong>Create Account</strong> button. This feature is currently available to all users.</p> <p>When creating a Free account:</p> <ul> <li>You can create up to <strong>5 Free accounts</strong>.</li> <li>Your user account must have at least <strong>7 days of tenure</strong> to be eligible.</li> <li>The account is created immediately and ready to use.</li> </ul> <p>To create a Free account, go to the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener"><strong>Cloudflare dashboard</strong><span class="external-link"> ↗</span></a> and select <strong>Create Account</strong> from either the account switcher in the top left (where your account name appears) or from the <strong>Accounts</strong> page.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="limitations">Limitations</h4><a class="anchor-link" href="#limitations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>This feature can only be used to create a Cloudflare Free account. To create an Enterprise Account under your existing contract, please contact Cloudflare Support.</li> <li>All users can create a Cloudflare Free account, however, Enterprises wish to restrict this action to only Super Administrators. We will deliver this improvement in a future release.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="next-steps">Next steps</h4><a class="anchor-link" href="#next-steps"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>After creating your Free account, you can:</p> <ul> <li><a href="https://developers.cloudflare.com/billing/get-started/create-billing-profile/">Add a payment method</a> to enable additional Cloudflare products and services.</li> <li><a href="https://developers.cloudflare.com/billing/get-started/update-billing-info/">Update billing information</a> to manage payment methods, billing address, or tax IDs.</li> <li><a href="https://developers.cloudflare.com/billing/understand/how-billing-works/">Review how Cloudflare billing works</a> to understand the billing lifecycle and charge types.</li> <li><a href="https://developers.cloudflare.com/fundamentals/organizations/for-enterprise/">Assign accounts to an Enterprise Organization</a> to centrally manage multiple accounts from a single dashboard.</li> </ul>Tue, 04 Aug 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsVectorize - Vectorize indexes now support up to 20 million vectorshttps://developers.cloudflare.com/changelog/post/2026-08-04-index-capacity-20-million/https://developers.cloudflare.com/changelog/post/2026-08-04-index-capacity-20-million/<p>You can now store up to 20 million vectors in a single Vectorize index, doubling the previous limit of 10 million vectors. This enables larger-scale semantic search, recommendation systems, and retrieval-augmented generation (RAG) applications without splitting data across multiple indexes.</p> <p>Vectorize continues to support indexes with up to 1,536 dimensions per vector at 32-bit precision. Refer to the <a href="https://developers.cloudflare.com/vectorize/platform/limits/">Vectorize limits documentation</a> for complete details.</p>Tue, 04 Aug 2026 00:00:00 GMTVectorizeVectorizeWAF - WAF Release - 2026-08-04https://developers.cloudflare.com/changelog/post/2026-08-04-waf-release/https://developers.cloudflare.com/changelog/post/2026-08-04-waf-release/ <p>This release introduces new rules and updates Microsoft SharePoint RCE alongside enhanced SSRF cloud protection rule actions.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-50522: An insecure deserialization vulnerability in Microsoft SharePoint Server. This may allow an unauthenticated attacker to execute arbitrary code using crafted requests.</li> <li>CVE-2026-66066: An improper input processing vulnerability in Ruby on Rails Active Storage image variant transformations. This may allow an unauthenticated attacker to perform arbitrary file reads and achieve Remote Code Execution (RCE) using maliciously crafted payload requests.</li> <li>Generic Cloud Protections: Added improved detection logic targeting Server-Side Request Forgery (SSRF) in cloud-hosted applications.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="91aee93c31944828bf86f068052b07cf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...052b07cf</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Microsoft SharePoint - Remote Code Execution - CVE:CVE-2026-50522</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="89d0243997d24c6ea1d610a23a5b40d6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3a5b40d6</span></button></rule-id></td><td>N/A</td><td>Rails - Arbitrary File Read &amp; RCE - CVE:CVE-2026-66066</td><td>Block</td><td>Block</td><td><p>This was labeled as File Upload - RCE.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ae40661b4ef24f9c8abd98338242627b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8242627b</span></button></rule-id></td><td>N/A</td><td>SSRF - Local</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="98bfd6bb46074d5b8d1c4b39743a63ec"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...743a63ec</span></button></rule-id></td><td>N/A</td><td>SSRF - Local - 2 - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54e1733b10da4a599e06c6fbc2e84e2d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c2e84e2d</span></button></rule-id></td><td>N/A</td><td>SSRF - Cloud - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ecd26d61a75e46f6a4449a06ab8af26f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ab8af26f</span></button></rule-id></td><td>N/A</td><td>SSRF - Cloud - 2 - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="281a1b7086b84db7a695220725ba9d7c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...25ba9d7c</span></button></rule-id></td><td>N/A</td><td>SSRF - Cloud</td><td>Disabled</td><td>Block</td><td><p>We are changing the action for this rule from Disabled to BLOCK</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="158177dec2504acdba1f2da201a076eb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...01a076eb</span></button></rule-id></td><td>N/A</td><td>SSRF - Local - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr></tbody></table>Tue, 04 Aug 2026 00:00:00 GMTWAFWAFWorkers - AI agents can debug Workers with local tracinghttps://developers.cloudflare.com/changelog/post/2026-08-04-local-tracing/https://developers.cloudflare.com/changelog/post/2026-08-04-local-tracing/<p><code>wrangler dev</code> and <code>vite dev</code> automatically capture structured OpenTelemetry traces and correlated console logs during local Worker invocations.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="debug-with-ai-agents">Debug with AI agents</h4><a class="anchor-link" href="#debug-with-ai-agents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When the tooling detects an AI agent session, it prints a terminal hint pointing to the <a href="https://developers.cloudflare.com/workers/local-development/local-explorer/#api">Local Explorer API</a> at <code>/cdn-cgi/explorer/api</code>. The API serves an OpenAPI schema and exposes a read-only observability query endpoint for discovering telemetry, querying traces and logs, and inspecting binding state.</p> <p>The agent can identify the exact failing operation, fix the code, rerun the request, and verify the result. This debug loop requires no deployment or temporary logs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="inspect-traces-in-local-explorer">Inspect traces in Local Explorer</h4><a class="anchor-link" href="#inspect-traces-in-local-explorer"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Humans can inspect the same <a href="https://developers.cloudflare.com/workers/observability/traces/">traces</a> and correlated console logs in the Local Explorer browser UI. Each trace shows spans, timing, attributes, and errors.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2048,height=847,format=webp/_astro/local-trace-failed-request.Bf0avznU.png" alt="Local Explorer showing a failed Worker trace with spans, timing, and errors" loading="lazy" decoding="async" width="2048" height="847"> <p>Automatic spans cover handler calls, outbound <code>fetch()</code> calls, and binding calls. Custom spans appear alongside these automatic spans.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/workers/local-development/local-explorer/">Local Explorer documentation</a>.</p>Tue, 04 Aug 2026 00:00:00 GMTWorkersWorkersWorkers - Node.js compatibility is now enabled by defaulthttps://developers.cloudflare.com/changelog/post/2026-08-04-nodejs-compat-default/https://developers.cloudflare.com/changelog/post/2026-08-04-nodejs-compat-default/ <p>Workers now enable the <code>nodejs_compat</code> and <code>nodejs_compat_v2</code> compatibility flags by default for <a href="https://developers.cloudflare.com/workers/configuration/compatibility-dates/">compatibility dates</a> of <code>2026-08-04</code> or later. These flags are not used for these compatibility dates because the compatibility date enables the same behavior.</p> <p>This means all <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/">Node.js built-in APIs</a> supported by the Workers runtime are available by default, including <code>node:crypto</code>, <code>node:buffer</code>, <code>node:stream</code>, <code>node:net</code>, <code>node:dns</code>, <code>node:fs</code>, <code>node:http</code>, and more. npm packages that depend on these APIs will work without additional configuration.</p> <p>Workers using an earlier compatibility date are not affected. They can still opt in by adding <code>nodejs_compat</code> to <code>compatibility_flags</code>.</p> <p>New projects do not need to add either flag. Existing projects can update their compatibility date without removing them. Wrangler, Miniflare, the Cloudflare Vite plugin, and Vitest Pool Workers ignore these redundant flags when starting the runtime.</p> <p>To turn off Node.js compatibility completely, remove any <code>nodejs_compat</code> and <code>nodejs_compat_v2</code> flags. Then add both of the following flags:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_flags"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "no_nodejs_compat"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "no_nodejs_compat_v2"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_flags = [</span><span class="nb-shiki-mdbnqw">"no_nodejs_compat"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"no_nodejs_compat_v2"</span><span class="nb-shiki-140thh">]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/">Node.js compatibility documentation</a>.</p>Tue, 04 Aug 2026 00:00:00 GMTWorkersWorkersAccess - Control authorization cookies for multi-domain Access applicationshttps://developers.cloudflare.com/changelog/post/2026-08-03-eager-redirect-cookie-setting/https://developers.cloudflare.com/changelog/post/2026-08-03-eager-redirect-cookie-setting/<p>Cloudflare Access administrators can now control whether a self-hosted application preemptively sets authorization cookies across its public hostnames.</p> <p>Previously, Access automatically used eager redirects for applications with five or fewer hostnames. Applications with more than five hostnames received cookies as users visited each hostname. Administrators can now choose either behavior, regardless of the number of hostnames.</p> <p>The new <strong>Eager redirect cookie</strong> setting is turned on by default for new applications. After a user signs in, Access redirects the browser through each hostname and sets a <code>CF_Authorization</code> cookie. This supports applications that need to make requests across hostnames before the user visits each one.</p> <p>For applications with many hostnames, the redirect chain can cause sign-in loops in some browsers. Turn off the setting to issue the cookie only when a user visits each hostname.</p> <p>To configure the setting, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/authorization-cookie/#eager-redirect-cookie">Authorization cookie</a>.</p>Mon, 03 Aug 2026 00:00:00 GMTAccessAccessAgents, Workers - Preview: @cloudflare/computer agent runtimehttps://developers.cloudflare.com/changelog/post/2026-08-03-cloudflare-computer/https://developers.cloudflare.com/changelog/post/2026-08-03-cloudflare-computer/<p>We're releasing an early preview of <a href="https://github.com/cloudflare/computer" target="_blank" rel="noopener"><code>@cloudflare/computer</code><span class="external-link"> ↗</span></a>, an open-source agent runtime that gives every agent its own computer. The runtime dynamically orchestrates between fast, efficient isolates and full Linux containers, so the agent always runs on the right compute primitive for the task at hand.</p> <p><code>@cloudflare/computer</code> provides a virtual filesystem backed by SQLite, which you can populate from cloud storage, source control, or any files you choose. Agents can read, write, and edit files, run shell commands, and interact with Git repositories. All operations are gated, audited, and observed.</p> <p>Install the package via npm:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-mdbnqw"> @cloudflare/computer</span></span></code></pre></figure> <p>Instantiate a <code>Workspace</code> inside any Durable Object to give your agent a filesystem and execution runtime:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Workspace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/computer"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workspace</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Workspace</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> storage: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.storage,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Several execution backends are included or you can write your own:</p> <ul> <li><strong>Isolate runtime</strong> — fast, horizontally scalable execution via <code>just-bash</code> and Dynamic Workers, ideal for file manipulation and data processing.</li> <li><strong>Container runtime</strong> — full Linux environment via Cloudflare Containers, mounted through FUSE, for tasks that need native binaries, package managers, or a complete userland.</li> </ul> <p>The AI SDK-compatible toolkit provides common agent tools (<code>read</code>, <code>write</code>, <code>edit</code>, <code>ls</code>, <code>exec</code>) and guides the model to choose the appropriate backend for each task.</p> <p>For more examples, including a step-by-step tutorial, visit the <a href="https://github.com/cloudflare/computer" target="_blank" rel="noopener"><code>@cloudflare/computer</code> repository<span class="external-link"> ↗</span></a>.</p> <p>Read the announcement blog post for more details: <a href="https://blog.cloudflare.com/cloudflare-computer/" target="_blank" rel="noopener">Your agent needs a computer, not a container<span class="external-link"> ↗</span></a>.</p>Mon, 03 Aug 2026 00:00:00 GMTAgentsAgentsWorkersPipelines - Billing is now enabled for Pipelineshttps://developers.cloudflare.com/changelog/post/2026-08-03-pipelines-billing-enabled/https://developers.cloudflare.com/changelog/post/2026-08-03-pipelines-billing-enabled/<p>Billing is now enabled for <a href="https://developers.cloudflare.com/pipelines/">Cloudflare Pipelines</a> on non-enterprise accounts. Pipelines usage beyond the included free tier will appear on your next invoice.</p> <p>Pipelines charges based on two usage dimensions. Ingress into a Pipeline stream remains free regardless of volume:</p> <ul> <li><strong>SQL transforms</strong>: $0.04 / GB for stateless transforms (filter, reshape, unnest, cast, compute).</li> <li><strong>Sinks (egress)</strong>: $0.03 / GB for JSON output, $0.06 / GB for Parquet or Iceberg output.</li> </ul> <p>Workers Paid plans include 50 GB / month for both SQL transforms and sinks. Standard <a href="https://developers.cloudflare.com/r2/pricing/">R2 storage and operations</a> charges apply for data written to R2 buckets, and <a href="https://developers.cloudflare.com/r2-data-catalog/platform/pricing/">R2 Data Catalog</a> charges apply when writing to Iceberg tables.</p> <p>For example, a pipeline that ingests 500 GB of event data per month, uses a SQL transform to filter and reshape it, and writes 300 GB to an R2 Data Catalog Iceberg table would be billed as follows:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Dimension</th> <th>Usage</th> <th>Included</th> <th>Billable</th> <th>Cost</th> </tr> </thead> <tbody> <tr> <td>Streams</td> <td>500 GB</td> <td>Unlimited</td> <td>0 GB</td> <td>$0.00</td> </tr> <tr> <td>SQL transforms</td> <td>500 GB</td> <td>50 GB</td> <td>450 GB</td> <td>$18.00</td> </tr> <tr> <td>Sinks (Iceberg)</td> <td>300 GB</td> <td>50 GB</td> <td>250 GB</td> <td>$15.00</td> </tr> <tr> <td><strong>Total</strong></td> <td></td> <td></td> <td></td> <td><strong>$33.00</strong></td> </tr> </tbody> </table></div> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/pipelines/platform/pricing/">Pipelines pricing</a>.</p>Mon, 03 Aug 2026 00:00:00 GMTPipelinesPipelinesR2, R2 Data Catalog - Billing is now enabled for R2 Data Cataloghttps://developers.cloudflare.com/changelog/post/2026-08-03-r2-data-catalog-billing-enabled/https://developers.cloudflare.com/changelog/post/2026-08-03-r2-data-catalog-billing-enabled/<p>Billing is now enabled for <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> on non-enterprise accounts. R2 Data Catalog usage beyond the included free tier will appear on your next invoice.</p> <p>R2 Data Catalog charges based on two dimensions, in addition to standard <a href="https://developers.cloudflare.com/r2/pricing/">R2 storage and operations</a>:</p> <ul> <li><strong>Catalog operations</strong>: $9.00 / million operations for metadata requests such as creating tables, reading table metadata, and updating table properties.</li> <li><strong>Compaction</strong>: $0.005 / GB processed and $2.00 / million objects processed. These charges only apply when <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">automatic compaction</a> is turned on for a table.</li> </ul> <p>Each dimension includes a monthly free tier: 1 million catalog operations, 10 GB of compaction data processed, and 1 million compaction objects processed.</p> <p>For example, a single Iceberg table with 50 GB of data, 500,000 catalog operations per month, and compaction turned on that processes 20 GB across 200,000 files would be billed as follows:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Dimension</th> <th>Usage</th> <th>Included</th> <th>Billable</th> <th>Cost</th> </tr> </thead> <tbody> <tr> <td>Catalog operations</td> <td>500,000</td> <td>1,000,000</td> <td>0</td> <td>$0.00</td> </tr> <tr> <td>Compaction (data processed)</td> <td>20 GB</td> <td>10 GB</td> <td>10 GB</td> <td>$0.05</td> </tr> <tr> <td>Compaction (objects)</td> <td>200,000</td> <td>1,000,000</td> <td>0</td> <td>$0.00</td> </tr> <tr> <td><strong>Total (Data Catalog)</strong></td> <td></td> <td></td> <td></td> <td><strong>$0.05</strong></td> </tr> </tbody> </table></div> <p>Standard R2 storage charges ($0.015 / GB-month) apply separately for the 50 GB of data stored.</p> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/platform/pricing/">R2 Data Catalog pricing</a>.</p>Mon, 03 Aug 2026 00:00:00 GMTR2R2R2 Data CatalogR2 SQL - Billing is now enabled for R2 SQLhttps://developers.cloudflare.com/changelog/post/2026-08-03-r2-sql-billing-enabled/https://developers.cloudflare.com/changelog/post/2026-08-03-r2-sql-billing-enabled/<p>Billing is now enabled for <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> on non-enterprise accounts. R2 SQL usage beyond the included free tier will appear on your next invoice.</p> <p>R2 SQL charges based on a single dimension:</p> <ul> <li><strong>Data scanned</strong>: $0.0025 / GB ($2.50 / TB) of compressed data read from R2 to execute your query.</li> </ul> <p>All plans include 10 GB of data scanned per month. Each query is billed for a minimum of 10 MB of data scanned. R2 SQL pricing is additive to standard <a href="https://developers.cloudflare.com/r2/pricing/">R2 storage and operations</a> and <a href="https://developers.cloudflare.com/r2-data-catalog/platform/pricing/">R2 Data Catalog</a> charges. R2 does not charge for egress, so there is no additional data transfer cost.</p> <p>For example, a user who stores 500 GB of Parquet data in R2 Data Catalog and runs queries that scan a total of 50 GB of compressed data during the month would be billed as follows:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Dimension</th> <th>Usage</th> <th>Included</th> <th>Billable</th> <th>Cost</th> </tr> </thead> <tbody> <tr> <td>R2 storage</td> <td>500 GB-month</td> <td>10 GB-month</td> <td>490 GB-month</td> <td>$7.35</td> </tr> <tr> <td>R2 SQL (data scanned)</td> <td>50 GB</td> <td>10 GB</td> <td>40 GB</td> <td>$0.10</td> </tr> <tr> <td><strong>Total</strong></td> <td></td> <td></td> <td></td> <td><strong>$7.45</strong></td> </tr> </tbody> </table></div> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/r2-sql/platform/pricing/">R2 SQL pricing</a>.</p>Mon, 03 Aug 2026 00:00:00 GMTR2 SQLR2 SQLWorkers - Python and JavaScript Workers can now call each other via RPChttps://developers.cloudflare.com/changelog/post/2026-08-03-python-javascript-rpc/https://developers.cloudflare.com/changelog/post/2026-08-03-python-javascript-rpc/ <p>You can now call methods between Python and JavaScript Workers using <a href="https://developers.cloudflare.com/workers/runtime-apis/rpc/">Workers RPC</a>. This works through <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/rpc/">Service bindings</a> without extra dependencies, schema definitions, or serialization code.</p> <p>Cross-language RPC calls behave like ordinary function calls. Exceptions propagate to the call site. You can pass <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#supported_types" target="_blank" rel="noopener">structured cloneable types<span class="external-link"> ↗</span></a> as parameters or return values, and Pyodide Foreign Function Interface (FFI) automatically converts types between languages.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="call-a-typescript-worker-from-python">Call a TypeScript Worker from Python</h4><a class="anchor-link" href="#call-a-typescript-worker-from-python"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Define a method in a TypeScript Worker:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkerEntrypoint } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> RpcService</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkerEntrypoint</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> add</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">a</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">b</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> a </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-140thh"> b;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkerEntrypoint } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> RpcService</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkerEntrypoint</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> add</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">a</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">b</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-dzsirb">number</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> a </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-140thh"> b;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Call it from a Python Worker through a Service binding:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Response, WorkerEntrypoint</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> Default</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkerEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(self, request):</span></span> <span class="line"><span class="nb-shiki-140thh"> rpc </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> self</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">RPC</span></span> <span class="line"><span class="nb-shiki-140thh"> result </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> rpc.add(</span><span class="nb-shiki-dzsirb">42</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">144</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.json({</span><span class="nb-shiki-mdbnqw">"result"</span><span class="nb-shiki-140thh">: result})</span></span></code></pre></figure> <p>Configure the Service binding in the Python Worker's Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "services"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"RPC"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "service"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"ts-rpc-server"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "entrypoint"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"RpcService"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">services</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"RPC"</span></span> <span class="line"><span class="nb-shiki-140thh">service = </span><span class="nb-shiki-mdbnqw">"ts-rpc-server"</span></span> <span class="line"><span class="nb-shiki-140thh">entrypoint = </span><span class="nb-shiki-mdbnqw">"RpcService"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="call-a-python-worker-from-javascript">Call a Python Worker from JavaScript</h4><a class="anchor-link" href="#call-a-python-worker-from-javascript"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Define a method in a Python Worker:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> WorkerEntrypoint</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> Default</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkerEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> highlight_code</span><span class="nb-shiki-140thh">(self, code: </span><span class="nb-shiki-dzsirb">str</span><span class="nb-shiki-140thh">, language: </span><span class="nb-shiki-dzsirb">str</span><span class="nb-shiki-140thh">) -&gt; </span><span class="nb-shiki-dzsirb">dict</span><span class="nb-shiki-140thh">:</span></span> <span class="line"><span class="nb-shiki-1itgoe"> from</span><span class="nb-shiki-140thh"> pygments.formatters </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> HtmlFormatter</span></span> <span class="line"><span class="nb-shiki-1itgoe"> from</span><span class="nb-shiki-140thh"> pygments </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> highlight</span></span> <span class="line"><span class="nb-shiki-1itgoe"> from</span><span class="nb-shiki-140thh"> pygments.lexers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> get_lexer_by_name</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> lexer </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> get_lexer_by_name(language, </span><span class="nb-shiki-1jdh33">stripall</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">True</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> formatter </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> HtmlFormatter(</span><span class="nb-shiki-1jdh33">linenos</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">True</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">cssclass</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"highlight"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">style</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"monokai"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> highlighted_html </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> highlight(code, lexer, formatter)</span></span> <span class="line"><span class="nb-shiki-140thh"> css </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> formatter.get_style_defs(</span><span class="nb-shiki-mdbnqw">".highlight"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "html"</span><span class="nb-shiki-140thh">: highlighted_html,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "css"</span><span class="nb-shiki-140thh">: css</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span></code></pre></figure> <p>Call it from a JavaScript Worker through a Service binding:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> rpc</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">PYTHON_RPC</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> rpc.</span><span class="nb-shiki-1t8gfj">highlight_code</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"print(42)"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"python"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> rpc</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">PYTHON_RPC</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> rpc.</span><span class="nb-shiki-1t8gfj">highlight_code</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"print(42)"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"python"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div></div> <p>Configure the Service binding in the JavaScript Worker's Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "services"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"PYTHON_RPC"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "service"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"py-rpc-server"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">services</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"PYTHON_RPC"</span></span> <span class="line"><span class="nb-shiki-140thh">service = </span><span class="nb-shiki-mdbnqw">"py-rpc-server"</span></span></code></pre></figure></div></div></div> <p>For more details on the announcement, read the <a href="https://blog.cloudflare.com/python-workers-rpc/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers/runtime-apis/rpc/">Workers RPC documentation</a> and the <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers overview</a>.</p>Mon, 03 Aug 2026 00:00:00 GMTWorkersWorkersCloudflare One Client - Cloudflare One Client for Windows (version 2026.7.1210.1)https://developers.cloudflare.com/changelog/post/2026-07-31-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2026-07-31-warp-windows-beta/<p>A new Beta release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This beta release includes the following changes and improvements:</p> <ul> <li>Improved connection reliability: the client now swaps protocol order after repeated connectivity-check failures, which helps when HTTP/3 is blocked after the QUIC handshake.</li> <li>Fixed issue where a certificate error could be incorrectly displayed right after the connection is established.</li> <li>A <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search domain</a> parsing failure no longer prevents connection.</li> <li>Fixed a <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">MASQUE</a> issue where the tunnel could stall while uploading at a high rate.</li> <li>Fixed being unable to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/">switch organizations</a> when the client was stuck in the &quot;Device not in organization&quot; state.</li> <li>Fixed the Home Screen dropdown popup not anchoring correctly.</li> <li>Fixed a crash during dialog dismissal.</li> <li>Increased tolerance for configurations with a large number of <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">local domain fallback</a> resolver IPs, so DNS resolution behaves correctly even when more fallback resolvers are configured than recommended.</li> <li>Fixed a networking issue where IPv6 multicast routes were being assigned to the WARP tunnel interface.</li> <li>Fixed fatal errors on UI load on Windows 10.</li> <li>Fixed a crash during Windows notification initialization.</li> <li>Made the Windows <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/client-checks/domain-joined/">domain-joined posture check</a> more reliable.</li> <li>Fixed orphaned credentials left behind on multi-user uninstall.</li> <li>A successful re-authentication will cause the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/">device profile</a> to be re-evaluated.</li> <li>Improved <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/">dashboard-managed client updates</a> by running the updater only when needed.</li> </ul> Fri, 31 Jul 2026 13:55:39 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for macOS (version 2026.7.1210.1)https://developers.cloudflare.com/changelog/post/2026-07-31-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2026-07-31-warp-macos-beta/<p>A new Beta release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This beta release includes the following changes and improvements:</p> <ul> <li>Improved connection reliability: the client now swaps protocol order after repeated connectivity-check failures, which helps when HTTP/3 is blocked after the QUIC handshake.</li> <li>Fixed issue where a certificate error could be incorrectly displayed right after the connection is established.</li> <li>A <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search domain</a> parsing failure no longer prevents connection.</li> <li>Fixed a <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">MASQUE</a> issue where the tunnel could stall while uploading at a high rate.</li> <li>Fixed being unable to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/">switch organizations</a> when the client was stuck in the &quot;Device not in organization&quot; state.</li> <li>Fixed the Home Screen dropdown popup not anchoring correctly.</li> <li>Fixed a crash during dialog dismissal.</li> <li>Increased tolerance for configurations with a large number of <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">local domain fallback</a> resolver IPs, so DNS resolution behaves correctly even when more fallback resolvers are configured than recommended.</li> <li>Fixed the WARP client stealing window focus (for example, during reauth).</li> <li>Fixed a client crash when connecting to a captive portal over Wi-Fi.</li> <li>Fixed the system tray icon showing &quot;disconnected&quot; while the UI showed &quot;connected&quot;.</li> <li>A successful re-authentication will cause the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/">device profile</a> to be re-evaluated.</li> <li>Improved <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/">dashboard-managed client updates</a> by running the updater only when needed.</li> </ul> Fri, 31 Jul 2026 13:55:38 GMTCloudflare One ClientCloudflare One ClientAccess - Static OAuth client credentials for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-07-31-mcp-portal-manual-oauth/https://developers.cloudflare.com/changelog/post/2026-07-31-mcp-portal-manual-oauth/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> can now connect to upstream MCP servers that require a pre-registered OAuth client. This supports OAuth providers that do not offer Dynamic Client Registration or have disabled it. This unlocks portal connections to major SaaS providers such as Slack and GitHub, whose MCP servers do not yet support DCR.</p> <p>When adding an MCP server, administrators can enter the client ID and client secret from an OAuth application registered with the upstream provider. The configuration also supports custom OAuth endpoints, scopes, and the <code>client_secret_post</code> and <code>client_secret_basic</code> token endpoint authentication methods.</p> <p>Cloudflare stores the client secret encrypted. Users still authenticate to the upstream server with their own accounts when they connect through a portal.</p> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#configure-manual-oauth-credentials">Configure manual OAuth credentials</a>.</p>Fri, 31 Jul 2026 00:00:00 GMTAccessAccessBrowser Run - Browser Run adds a Playground to the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-07-31-br-dashboard-playground/https://developers.cloudflare.com/changelog/post/2026-07-31-br-dashboard-playground/ <p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> now includes a Playground in the Cloudflare dashboard. Use it to try Quick Actions against a live browser without creating a Worker, installing an SDK, or deploying code first.</p> <p>The Playground helps you test a target URL or raw HTML input, tune viewport and page-load settings, preview the output, and copy working code for the same request.</p> <img src="https://developers.cloudflare.com/images/browser-run/playground.png" alt="Browser Run Playground in the Cloudflare dashboard showing a generated screenshot preview and output settings"> <p>With the Playground, you can:</p> <ul> <li>Capture visuals as <a href="https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/">screenshots</a> or <a href="https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/">PDFs</a>.</li> <li>Generate multiple output formats in one request with the <a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/">snapshot endpoint</a>.</li> <li>Extract <a href="https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/">HTML</a>, <a href="https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/">Markdown</a>, <a href="https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/">links</a>, or <a href="https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/">scraped data</a>.</li> <li>Extract <a href="https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/">structured data with AI</a> using a prompt and optional JSON Schema.</li> </ul> <p>You can also configure desktop, laptop, tablet, mobile, or custom viewport sizes, set browser scale, choose page-load conditions, set timeouts, and wait for selectors before running a request.</p> <p>Select <strong>Show Code</strong> to generate the same request as cURL, TypeScript SDK, Python, or Workers Binding code. For example, a screenshot request can be copied as a Workers Binding call:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> BROWSER</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> BrowserRun</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">quickAction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"screenshot"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://developers.cloudflare.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> viewport: {</span></span> <span class="line"><span class="nb-shiki-140thh"> width: </span><span class="nb-shiki-dzsirb">1920</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> height: </span><span class="nb-shiki-dzsirb">1080</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure> <p>Requests made in the Playground incur <a href="https://developers.cloudflare.com/browser-run/pricing/">Browser Run charges</a>. AI extraction also incurs Workers AI charges.</p> <p>To try the Playground, go to <strong>Browser Run</strong> in the Cloudflare dashboard and select <strong>Playground</strong>.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers/browser-run" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Browser Run</strong>&nbsp;&#8599;</a> <p>For more information, refer to the <a href="https://developers.cloudflare.com/browser-run/quick-actions/">Quick Actions documentation</a>.</p>Fri, 31 Jul 2026 00:00:00 GMTBrowser RunBrowser RunStream - Rotate Stream broadcast keys for live inputshttps://developers.cloudflare.com/changelog/post/2026-07-30-rotate-stream-broadcast-keys/https://developers.cloudflare.com/changelog/post/2026-07-30-rotate-stream-broadcast-keys/<p>You can now rotate the broadcast credentials for a Stream live input without changing the live input identifier.</p> <p>Use key rotation when live input credentials may have been shared with the wrong audience, exposed in client code or a screenshare, or need to be refreshed as part of your security process. Rotating keys revokes the old credentials, disconnects broadcasts using stale credentials, and returns refreshed credentials in the API response.</p> <p>To rotate keys for a live input, make a <code>POST</code> request to the <code>rotate_keys</code> endpoint:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">https://api.cloudflare.com/client/v4/accounts/{</span><span class="nb-shiki-1t8gfj">account_id}/stream/live_inputs/</span><span class="nb-shiki-mdbnqw">{live_input_identifier}</span><span class="nb-shiki-1t8gfj">/rotate_keys</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer &lt;API_TOKEN&gt;"</span></span></code></pre></figure> <p>Live input responses now also include <code>keysRotatedAt</code>, which indicates when the live input keys were last rotated. This field is omitted for live inputs whose keys have never been rotated.</p> <p>For endpoint details, refer to <a href="https://developers.cloudflare.com/api/resources/stream/subresources/live_inputs/methods/rotate_keys/">Rotate keys for a live input</a>. For usage guidance, refer to <a href="https://developers.cloudflare.com/stream/stream-live/start-stream-live/#manage-live-inputs">Manage live inputs</a>.</p>Fri, 31 Jul 2026 00:00:00 GMTStreamStreamWorkers, Durable Objects - Inspect Worker startup performance with Wranglerhttps://developers.cloudflare.com/changelog/post/2026-07-31-wrangler-startup-profile-summary/https://developers.cloudflare.com/changelog/post/2026-07-31-wrangler-startup-profile-summary/<p><code>wrangler check startup</code> now reports your Worker's raw and compressed bundle sizes. It also summarizes local CPU activity during startup directly in your terminal.</p> <p>Large bundles and costly startup work can introduce cold-start latency, so use this command to find code and large dependencies that slow your Worker before it handles requests.</p> <p>The summary includes sampled, active, garbage collection, and idle time. Wrangler continues to save a <code>.cpuprofile</code> file for detailed flamegraph analysis in Chrome DevTools or VS Code.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">⛅️</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-dzsirb"> 4.116.0</span></span> <span class="line"><span class="nb-shiki-1t8gfj">───────────────────────────────────────────────</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├</span><span class="nb-shiki-mdbnqw"> Building</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> Worker</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Worker</span><span class="nb-shiki-mdbnqw"> Built!</span><span class="nb-shiki-mdbnqw"> 🎉</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├</span><span class="nb-shiki-mdbnqw"> Analysing</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Startup</span><span class="nb-shiki-mdbnqw"> phase</span><span class="nb-shiki-mdbnqw"> analysed</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Bundle:</span><span class="nb-shiki-dzsirb"> 7171.25</span><span class="nb-shiki-mdbnqw"> KiB</span><span class="nb-shiki-mdbnqw"> /</span><span class="nb-shiki-mdbnqw"> gzip:</span><span class="nb-shiki-dzsirb"> 2197.00</span><span class="nb-shiki-mdbnqw"> KiB</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Local</span><span class="nb-shiki-mdbnqw"> startup</span><span class="nb-shiki-mdbnqw"> profile:</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Profile</span><span class="nb-shiki-mdbnqw"> window:</span><span class="nb-shiki-dzsirb"> 70.3</span><span class="nb-shiki-mdbnqw"> ms</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Sampled</span><span class="nb-shiki-mdbnqw"> time:</span><span class="nb-shiki-dzsirb"> 70.3</span><span class="nb-shiki-mdbnqw"> ms</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Active:</span><span class="nb-shiki-dzsirb"> 38.5</span><span class="nb-shiki-mdbnqw"> ms</span><span class="nb-shiki-140thh"> (including </span><span class="nb-shiki-dzsirb">3.7</span><span class="nb-shiki-mdbnqw"> ms</span><span class="nb-shiki-mdbnqw"> garbage</span><span class="nb-shiki-mdbnqw"> collection</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Idle:</span><span class="nb-shiki-dzsirb"> 31.8</span><span class="nb-shiki-mdbnqw"> ms</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Samples:</span><span class="nb-shiki-dzsirb"> 36</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> CPU</span><span class="nb-shiki-mdbnqw"> Profile</span><span class="nb-shiki-mdbnqw"> has</span><span class="nb-shiki-mdbnqw"> been</span><span class="nb-shiki-mdbnqw"> written</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> worker-startup.cpuprofile.</span><span class="nb-shiki-mdbnqw"> Load</span><span class="nb-shiki-mdbnqw"> it</span><span class="nb-shiki-mdbnqw"> into</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> Chrome</span><span class="nb-shiki-mdbnqw"> DevTools</span><span class="nb-shiki-mdbnqw"> profiler</span><span class="nb-shiki-140thh"> (or </span><span class="nb-shiki-mdbnqw">directly</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> VSCode</span><span class="nb-shiki-140thh">) to view a flamegraph.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> Note</span><span class="nb-shiki-mdbnqw"> that</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> CPU</span><span class="nb-shiki-mdbnqw"> Profile</span><span class="nb-shiki-mdbnqw"> was</span><span class="nb-shiki-mdbnqw"> measured</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> Worker</span><span class="nb-shiki-mdbnqw"> running</span><span class="nb-shiki-mdbnqw"> locally</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> machine,</span><span class="nb-shiki-mdbnqw"> which</span><span class="nb-shiki-mdbnqw"> has</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> different</span><span class="nb-shiki-mdbnqw"> CPU</span><span class="nb-shiki-mdbnqw"> than</span><span class="nb-shiki-mdbnqw"> when</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> Worker</span><span class="nb-shiki-mdbnqw"> runs</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> Cloudflare.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> As</span><span class="nb-shiki-mdbnqw"> such,</span><span class="nb-shiki-mdbnqw"> CPU</span><span class="nb-shiki-mdbnqw"> Profile</span><span class="nb-shiki-mdbnqw"> can</span><span class="nb-shiki-mdbnqw"> be</span><span class="nb-shiki-mdbnqw"> used</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> understand</span><span class="nb-shiki-mdbnqw"> where</span><span class="nb-shiki-mdbnqw"> time</span><span class="nb-shiki-mdbnqw"> is</span><span class="nb-shiki-mdbnqw"> spent</span><span class="nb-shiki-mdbnqw"> at</span><span class="nb-shiki-mdbnqw"> startup,</span><span class="nb-shiki-mdbnqw"> but</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> overall</span><span class="nb-shiki-mdbnqw"> startup</span><span class="nb-shiki-mdbnqw"> time</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> profile</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> not</span><span class="nb-shiki-mdbnqw"> be</span><span class="nb-shiki-mdbnqw"> expected</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> exactly</span><span class="nb-shiki-mdbnqw"> match</span><span class="nb-shiki-mdbnqw"> what</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> Worker's startup time will be when deploying to Cloudflare.</span></span></code></pre></figure> <p>The profile runs locally, so its duration will differ from startup time on Cloudflare. For authoritative startup time, deploy your Worker or upload a version.</p> <p>Available in Wrangler version 4.116.0 or later. For more information, refer to <a href="https://developers.cloudflare.com/workers/wrangler/commands/workers/#startup"><code>wrangler check startup</code></a>.</p>Fri, 31 Jul 2026 00:00:00 GMTWorkersWorkersDurable ObjectsAccess - Admins can turn on Code Mode by default for MCP portal usershttps://developers.cloudflare.com/changelog/post/2026-07-30-mcp-portal-code-mode-policies/https://developers.cloudflare.com/changelog/post/2026-07-30-mcp-portal-code-mode-policies/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> now support four Code Mode policies: <em>Off</em>, <em>Opt-in</em>, <em>On by default</em>, and <em>Enforced</em>. Admins can choose whether Code Mode is unavailable, optional, enabled by default, or required for every session.</p> <p>Existing portals retain their current behavior. Portals that previously allowed Code Mode use <em>Opt-in</em>, while portals that did not allow Code Mode use <em>Off</em>. New portals also use <em>Opt-in</em> by default.</p> <p>Clients turn on Code Mode for an <em>Opt-in</em> portal with <code>?codemode=search_and_execute</code>. The <em>On by default</em> policy lets clients opt out with <code>?codemode=off</code>, which avoids nested code execution when a client runs its own Code Mode implementation. The <em>Off</em> and <em>Enforced</em> policies ignore client overrides.</p> <p>The Cloudflare API exposes these policies through the <code>code_mode</code> field:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "code_mode"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"default_on"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>The supported values are <code>off</code>, <code>opt_in</code>, <code>default_on</code>, and <code>enforced</code>. The previous <code>allow_code_mode</code> boolean is deprecated.</p> <p>For configuration details and client behavior, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#code-mode-policies">Code Mode policies</a>.</p>Thu, 30 Jul 2026 00:00:00 GMTAccessAccessAI Search - Use AI Search with the Agents SDK, AI SDK, and LangChainhttps://developers.cloudflare.com/changelog/post/2026-07-30-ai-search-agent-sdks/https://developers.cloudflare.com/changelog/post/2026-07-30-ai-search-agent-sdks/ <p>You can now use <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> directly from popular agent frameworks, adding grounded retrieval to an existing app instead of calling the REST API by hand. The new <a href="https://developers.cloudflare.com/ai-search/agent-sdks/">Agents</a> section has guides for the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/ai-sdk/">Vercel AI SDK</a>, <a href="https://developers.cloudflare.com/ai-search/agent-sdks/langchain/">LangChain</a>, and the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/">Cloudflare Agents SDK</a>. The AI SDK integration is a new package, and the LangChain integration is a new retriever in the existing <code>langchain-cloudflare</code> package.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="vercel-ai-sdk">Vercel AI SDK</h4><a class="anchor-link" href="#vercel-ai-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://www.npmjs.com/package/ai-search-provider" target="_blank" rel="noopener"><code>ai-search-provider</code><span class="external-link"> ↗</span></a> package connects AI Search to the AI SDK, and targets AI SDK v6 (<code>ai@^6</code>). Pass <code>instance.chat()</code> to <code>generateText</code> or <code>streamText</code> to generate a response grounded in your indexed content, with the retrieved chunks returned as <code>sources</code>. You can also expose <code>instance.search()</code> as a tool for agent loops.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createAISearchNamespace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai-search-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiSearch</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createAISearchNamespace</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">text</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sources</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: aiSearch.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"How does caching work?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createAISearchNamespace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai-search-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiSearch</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createAISearchNamespace</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">text</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sources</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: aiSearch.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"How does caching work?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="langchain">LangChain</h4><a class="anchor-link" href="#langchain"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>langchain-cloudflare</code> package (<a href="https://pypi.org/project/langchain-cloudflare/" target="_blank" rel="noopener">PyPI<span class="external-link"> ↗</span></a>, <a href="https://github.com/cloudflare/langchain-cloudflare" target="_blank" rel="noopener">GitHub<span class="external-link"> ↗</span></a>) provides <code>CloudflareAISearchRetriever</code>, a standard LangChain retriever backed by AI Search. Use it on its own, wrap it with <code>create_retriever_tool</code> to give an agent a search tool, or drop it into a RAG chain. It works with REST credentials or a Worker binding inside a Python Worker.</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> langchain_cloudflare </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> CloudflareAISearchRetriever</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">retriever </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> CloudflareAISearchRetriever(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> account_id</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">ACCOUNT_ID</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> api_token</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">API_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> instance_name</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> retrieval_type</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"hybrid"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">docs </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> retriever.invoke(</span><span class="nb-shiki-mdbnqw">"How do I configure Workers AI?"</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflare-agents-sdk">Cloudflare Agents SDK</h4><a class="anchor-link" href="#cloudflare-agents-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://developers.cloudflare.com/agents/">Cloudflare Agents SDK</a> could already reach AI Search through the Workers binding. The new <a href="https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/">guide</a> walks through building a stateful chat agent that provisions its own instance, indexes content, and searches it from a tool.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Expose AI Search to the agent's model as a tool it can call.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> searchKnowledgeBase</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Search the knowledge base for relevant content."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ query: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">query</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({ query }),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Expose AI Search to the agent's model as a tool it can call.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> searchKnowledgeBase</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Search the knowledge base for relevant content."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ query: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">query</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({ query }),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>For the full walkthroughs, including creating an instance and indexing content, refer to the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/">Agents</a> guides.</p>Thu, 30 Jul 2026 00:00:00 GMTAI SearchAI SearchWorkers - Node.js 24 is now the default for Workers Buildshttps://developers.cloudflare.com/changelog/post/2026-07-30-workers-builds-nodejs-24/https://developers.cloudflare.com/changelog/post/2026-07-30-workers-builds-nodejs-24/<p>Workers Builds now uses Node.js 24.18.0 by default. The build image preinstalls Node.js 22.23.2 and 24.18.0.</p> <p>You can continue to override the default with the <code>NODE_VERSION</code> environment variable, an <code>.nvmrc</code> file, or a <code>.node-version</code> file. For more information, refer to <a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#overriding-default-versions">Override default versions</a>.</p>Thu, 30 Jul 2026 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2026-07-29https://developers.cloudflare.com/changelog/post/2026-07-29-waf-release/https://developers.cloudflare.com/changelog/post/2026-07-29-waf-release/ <p>This release introduces new rules and updates existing threat signatures to provide targeted protections for vulnerabilities in Nuxt Server Island components and Alibaba Fastjson deserialization routines, alongside enhanced protections for cloud metadata Server-Side Request Forgery (SSRF) and obfuscated command injection attempts.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Nuxt Server Island - RCE(GHSA-9473-5f9j-94wq): An unauthenticated vulnerability in Nuxt Server Islands where remote attackers can supply arbitrary component names or props to endpoints. Manipulating these parameters allows unauthenticated component Remote Code Execution (RCE) on the server.</p> </li> <li> <p>Alibaba Fastjson JSONType Remote Code Execution: A unauthenticated remote code execution vulnerability in Alibaba Fastjson (≤ 1.2.83) during JSON deserialization. Under default configurations, attackers can execute arbitrary system commands, bypassing traditional classpath and gadget-based defenses.</p> </li> <li> <p>Generic Protections (SSRF &amp; Command Injection): Added improved detection logic targeting Server-Side Request Forgery (SSRF) in cloud-hosted applications, alongside new rules targeting obfuscated command injection patterns across request parameters.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54e1733b10da4a599e06c6fbc2e84e2d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c2e84e2d</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>SSRF - Cloud - Beta</td><td>Log</td><td>Block</td><td><p>This is an improved detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="95a84ab1645a49c685648c17761e7a4c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...761e7a4c</span></button></rule-id></td><td>N/A</td><td>Command Injection - Obfuscation</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="58df9693db4d454a8764fcda7347c892"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7347c892</span></button></rule-id></td><td>N/A</td><td>Alibaba Fastjson JSONType Remote Code Execution - Body</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6159ead63d284147943dc5a18ec012ea"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8ec012ea</span></button></rule-id></td><td>N/A</td><td>Nuxt Server Island - RCE</td><td>N/A</td><td>Block</td><td><p>This is a new detection.This was labeled as Generic Rules - RCE.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="dcf635ab2e744e1a994443973590a4ad"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3590a4ad</span></button></rule-id></td><td>N/A</td><td>Generic Rules - RCE</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d3852d0891634686a46114069c6dff1c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9c6dff1c</span></button></rule-id></td><td>N/A</td><td>Generic Rules - XSS</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="89d0243997d24c6ea1d610a23a5b40d6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3a5b40d6</span></button></rule-id></td><td>N/A</td><td>File Upload - RCE</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="6ad9f2049b094c608be0f8adcfe1a93c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cfe1a93c</span></button></rule-id></td><td>N/A</td><td>Generic Rules - RCE</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="5bdf578fff504b8cbe3b7f699ab5ed95"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9ab5ed95</span></button></rule-id></td><td>N/A</td><td>Generic Rules - XSS</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="7ecac499d14a4750aa58c1e21b7f9c67"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1b7f9c67</span></button></rule-id></td><td>N/A</td><td>File Upload - RCE</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr></tbody></table>Wed, 29 Jul 2026 00:00:00 GMTWAFWAF1.1.1.1 - Improved DoH JSON formatting for additional record typeshttps://developers.cloudflare.com/changelog/post/2026-07-28-improved-record-display-format/https://developers.cloudflare.com/changelog/post/2026-07-28-improved-record-display-format/<p>Cloudflare is rolling out updated formatting for the <code>data</code> field in the 1.1.1.1 <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/">DoH JSON API</a> (<code>application/dns-json</code>). During the roll out responses may use either the old or new format.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>These are breaking changes. The DoH JSON format has no formal RFC and its schema is not guaranteed to be stable. If you need a stable format, use the <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-wireformat/">DoH wireformat</a> instead.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="human-readable-display-for-additional-record-types">Human-readable display for additional record types</h4><a class="anchor-link" href="#human-readable-display-for-additional-record-types"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Several record types previously returned their <code>data</code> field in <a href="https://datatracker.ietf.org/doc/html/rfc3597" target="_blank" rel="noopener">RFC 3597<span class="external-link"> ↗</span></a> generic hex encoding (<code>\# &lt;length&gt; &lt;hex&gt;</code>). These now use standard presentation format:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">CAA: 0 issue "letsencrypt.org"</span></span> <span class="line"><span class="nb-shiki-wvjl67">NAPTR: 100 10 "s" "SIP+D2U" "" _sip._udp.example.com.</span></span> <span class="line"><span class="nb-shiki-wvjl67">RP: admin.example.com. txt.example.com.</span></span> <span class="line"><span class="nb-shiki-wvjl67">IPSECKEY: 10 1 2 192.0.2.1 AwEA...</span></span> <span class="line"><span class="nb-shiki-wvjl67">SVCB: 1 target.example.com. alpn=h2</span></span> <span class="line"><span class="nb-shiki-wvjl67">HTTPS: 1 . alpn=h3,h2 ipv4hint=192.0.2.1</span></span> <span class="line"><span class="nb-shiki-wvjl67">TLSA: 3 1 1 aabbccdd...</span></span> <span class="line"><span class="nb-shiki-wvjl67">SSHFP: 1 2 aabbccdd...</span></span> <span class="line"><span class="nb-shiki-wvjl67">OPENPGPKEY: AwEA...</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="numeric-dnssec-algorithm-identifiers">Numeric DNSSEC algorithm identifiers</h4><a class="anchor-link" href="#numeric-dnssec-algorithm-identifiers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>DNSSEC-related records now use numeric algorithm identifiers as defined in <a href="https://datatracker.ietf.org/doc/html/rfc4034" target="_blank" rel="noopener">RFC 4034<span class="external-link"> ↗</span></a> instead of mnemonic names. This affects <code>RRSIG</code>, <code>DS</code>, <code>CDS</code>, <code>DNSKEY</code>, and <code>CDNSKEY</code> records. For example, <code>RSASHA256</code> becomes <code>8</code>, <code>ECDSAP256SHA256</code> becomes <code>13</code>, and <code>ED25519</code> becomes <code>15</code>. DS digest types also change from mnemonic to numeric: <code>SHA-256</code> becomes <code>2</code>.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="txt"><figcaption class="nb-code-title"><span class="nb-code-title-name">Before</span><span class="nb-code-title-lang">txt</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">RRSIG: A RSASHA256 2 300 ...</span></span> <span class="line"><span class="nb-shiki-wvjl67">DS: 12345 RSASHA256 SHA-256 aabb...</span></span> <span class="line"><span class="nb-shiki-wvjl67">DNSKEY: 257 3 RSASHA256 AwEA...</span></span></code></pre></figure> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="txt"><figcaption class="nb-code-title"><span class="nb-code-title-name">After</span><span class="nb-code-title-lang">txt</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">RRSIG: A 8 2 300 ...</span></span> <span class="line"><span class="nb-shiki-wvjl67">DS: 12345 8 2 aabb...</span></span> <span class="line"><span class="nb-shiki-wvjl67">DNSKEY: 257 3 8 AwEA...</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-formatting-changes">Other formatting changes</h4><a class="anchor-link" href="#other-formatting-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>HINFO</code> character-strings are now individually quoted to remove ambiguity when values contain spaces:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="txt"><figcaption class="nb-code-title"><span class="nb-code-title-name">Before</span><span class="nb-code-title-lang">txt</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">"data": "Intel Xeon Linux"</span></span></code></pre></figure> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="txt"><figcaption class="nb-code-title"><span class="nb-code-title-name">After</span><span class="nb-code-title-lang">txt</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">"data": "\"Intel Xeon\" \"Linux\""</span></span></code></pre></figure>Tue, 28 Jul 2026 00:00:00 GMT1.1.1.11.1.1.1Agents, Workers - Cloudflare MCP servers support the new MCP 2026-07-28 Specificationhttps://developers.cloudflare.com/changelog/post/2026-07-28-cloudflare-mcp-servers-mcp-2026-07-28/https://developers.cloudflare.com/changelog/post/2026-07-28-cloudflare-mcp-servers-mcp-2026-07-28/<p>Cloudflare's <a href="https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/#product-specific-mcp-servers">product-specific MCP servers</a> now support the new MCP 2026-07-28 Specification. Each request runs on a fresh stateless server without an MCP protocol session or protocol-specific Durable Object.</p> <p>The <code>/mcp</code> endpoint also accepts stateless requests from 2025 Streamable HTTP clients. Most clients can reconnect without configuration changes.</p> <p>Use <code>/mcp</code> for new connections. Historical <code>/sse</code> URLs continue to work as aliases for the same Streamable HTTP handler, but they no longer serve the deprecated HTTP+SSE transport. If a client forces SSE transport, change it to Streamable HTTP or automatic transport detection.</p>Tue, 28 Jul 2026 00:00:00 GMTAgentsAgentsWorkersBrowser Run - Browser Run adds structured handoff for Human in the Loophttps://developers.cloudflare.com/changelog/post/2026-07-28-human-in-the-loop/https://developers.cloudflare.com/changelog/post/2026-07-28-human-in-the-loop/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> now supports structured handoff for <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop</a> workflows. Using Cloudflare-specific <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/#cloudflare-cdp-commands">CDP commands</a>, your agent can signal that it needs help, a human steps in through <a href="https://developers.cloudflare.com/browser-run/features/live-view/">Live View</a> to handle the task, and the agent resumes once the work is done.</p> <p>For agents running multi-step browser workflows, a single login wall or unexpected prompt can fail the entire run. Previously, scripts had to manage human intervention manually by sharing a Live View URL and polling for completion. Structured handoff replaces this with a formal pause-and-resume flow.</p> <p>The following example requests human intervention for a login page and waits for the human to finish before continuing:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> cdp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">createCDPSession</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Get Live View URL for the human operator</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">devtoolsFrontendUrl</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.getLiveView"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> mode: </span><span class="nb-shiki-mdbnqw">"tab"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Human input needed: ${</span><span class="nb-shiki-140thh">devtoolsFrontendUrl</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Request human intervention and wait for completion</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> handoffComplete</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">resolve</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">once</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.handoffComplete"</span><span class="nb-shiki-140thh">, resolve);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> cdp.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Cloudflare.handoff"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> instructions: </span><span class="nb-shiki-mdbnqw">"Please log in with your credentials"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-dzsirb">600000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> handoffComplete;</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(result.success </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-mdbnqw"> "Handoff complete"</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-mdbnqw"> `Failed: ${</span><span class="nb-shiki-140thh">result</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">reason</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Refer to the <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop documentation</a> for the full API reference, examples, and best practices.</p>Tue, 28 Jul 2026 00:00:00 GMTBrowser RunBrowser RunCloudflare One, Gateway - Control Cloudflare Gateway DNS caching with a maximum TTL settinghttps://developers.cloudflare.com/changelog/post/2026-07-28-gateway-maximum-dns-ttl/https://developers.cloudflare.com/changelog/post/2026-07-28-gateway-maximum-dns-ttl/<p>You can now set a maximum time-to-live (TTL) for DNS responses returned by Gateway. When an upstream DNS record has a TTL that exceeds the configured maximum, Gateway caps it to your specified value. This ensures that DNS policy changes - such as blocking a newly identified malicious domain - take effect faster across all clients.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2170,height=294,format=webp/_astro/gateway-max-ttl-traffic-settings.BRF3NUMp.png" alt="The maximum DNS TTL setting in Traffic policies > Traffic settings, showing a numeric input field that accepts values between 60 and 36,000 seconds" loading="lazy" decoding="async" width="2170" height="294"> <p>The setting is available at two levels:</p> <ul> <li><strong>Account level</strong> - In <strong>Traffic Policies</strong> &gt; <strong>Traffic Settings</strong>, under <strong>Proxy and inspection</strong>. This sets the default cap for all DNS locations.</li> <li><strong>Per-location</strong> - Each <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-proxies/">DNS location</a> can inherit the account setting, disable the cap, or override it with a custom value.</li> </ul> <p>Two new fields are also available in DNS logs: <code>upstream_record_ttls</code> (the original TTL from the upstream response) and <code>applied_max_ttl</code> (the cap Gateway applied). These appear in the DNS logs column picker and in Logpush datasets.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/maximum-dns-ttl/">Maximum DNS TTL</a>.</p>Tue, 28 Jul 2026 00:00:00 GMTCloudflare OneCloudflare OneGatewayWorkers AI - Select models now require the Workers Paid planhttps://developers.cloudflare.com/changelog/post/2026-07-28-models-require-workers-paid/https://developers.cloudflare.com/changelog/post/2026-07-28-models-require-workers-paid/<p>We are limiting Workers Free plan access to a few resource-intensive models so we can prioritize capacity for the broader Workers AI user base. This helps everyone get a more reliable inference experience, with fewer <code>429</code> and <code>3040</code> (Out of Capacity) errors.</p> <p>The following models now require the <a href="https://developers.cloudflare.com/workers/platform/pricing/#workers">Workers Paid plan</a>:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/"><code>@cf/moonshotai/kimi-k2.6</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/"><code>@cf/moonshotai/kimi-k2.7-code</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/glm-5.2/"><code>@cf/zai-org/glm-5.2</code></a></li> </ul> <p>On the Workers Free plan, requests to these models now return a <code>403</code> HTTP error (<a href="https://developers.cloudflare.com/workers-ai/platform/errors/">internal error <code>5035</code></a>) prompting you to upgrade. The Workers Paid plan starts at $5 per month and still includes the 10,000 free Neurons per day allocation, with usage beyond that billed at each <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">model's pricing</a>.</p> <p>Many models remain available on the Workers Free plan, including:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/"><code>@cf/zai-org/glm-4.7-flash</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/"><code>@cf/google/gemma-4-26b-a4b-it</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/"><code>@cf/nvidia/nemotron-3-120b-a12b</code></a></li> </ul> <p>For the full list, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/">Workers AI model catalog</a>.</p>Tue, 28 Jul 2026 00:00:00 GMTWorkers AIWorkers AIWorkers - Workers tracing — write custom spans with new startActiveSpan() and span.end() runtime APIshttps://developers.cloudflare.com/changelog/post/2026-07-28-start-active-span/https://developers.cloudflare.com/changelog/post/2026-07-28-start-active-span/ <p>The Workers runtime now provides built-in <code>tracing.startActiveSpan()</code> and <code>span.end()</code> APIs, allowing you to write custom spans for operations that last beyond a single callback — for example, instrumenting a stream pipeline where the span should stay open until the stream is fully consumed.</p> <p>This augments the <a href="https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/">existing API for writing custom spans</a>, <code>tracing.enterSpan()</code>, which automatically ends a span when its callback is returned. With <code>startActiveSpan()</code>, the span remains open after the callback returns, and you call <code>span.end()</code> when the work is complete:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tracing } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> encoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startActiveSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream-response"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">span</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> timer;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> body</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> start</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">controller</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Starting...</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> timer </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Complete.</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"complete"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }, </span><span class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> cancel</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (timer </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-dzsirb"> undefined</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1t8gfj">clearTimeout</span><span class="nb-shiki-140thh">(timer);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"cancelled"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(body, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"content-type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tracing } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> encoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">()</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startActiveSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream-response"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">span</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> timer</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ReturnType</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1itgoe">typeof</span><span class="nb-shiki-140thh"> setTimeout> </span><span class="nb-shiki-1itgoe">|</span><span class="nb-shiki-dzsirb"> undefined</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> body</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Uint8Array</span><span class="nb-shiki-140thh">>({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> start</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">controller</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Starting...</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> timer </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Complete.</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"complete"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }, </span><span class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> cancel</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (timer </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-dzsirb"> undefined</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1t8gfj">clearTimeout</span><span class="nb-shiki-140thh">(timer);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"cancelled"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(body, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"content-type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>For more details, refer to the <a href="https://developers.cloudflare.com/workers/observability/traces/custom-spans/">custom spans documentation</a>.</p>Tue, 28 Jul 2026 00:00:00 GMTWorkersWorkersAgents, Workers - Agents SDK adds MCP Specification 2026-07-28 supporthttps://developers.cloudflare.com/changelog/post/2026-07-27-agents-sdk-v0.20.0-mcp-sdk-v2/https://developers.cloudflare.com/changelog/post/2026-07-27-agents-sdk-v0.20.0-mcp-sdk-v2/ <p>Agents SDK v0.20.0 adds client and server support for the <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/" target="_blank" rel="noopener">MCP 2026-07-28 release candidate<span class="external-link"> ↗</span></a>. Workers can serve tools, prompts, resources, and elicitation without an MCP transport session or Durable Object. Agents can connect to both MCP 2026-07-28 servers and existing legacy servers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="client-support">Client support</h4><a class="anchor-link" href="#client-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The MCP client manager now uses <code>@modelcontextprotocol/client</code>. For each connection, it probes for MCP 2026-07-28 support with <code>server/discover</code>. If the server does not support the stateless protocol, the client continues with the legacy <code>initialize</code> handshake on the same connection. Existing <code>addMcpServer</code> calls do not need a protocol-version setting or separate clients for each protocol generation.</p> <p>For stateless requests, elicitation uses <code>input_required</code> through multi-round-trip requests (MRTR). The legacy path uses the same form and URL handlers for pushed requests. The SDK collects input, retries the original operation, and resolves the original <code>callTool</code>, <code>getPrompt</code>, or <code>readResource</code> promise with its final result.</p> <p>OAuth callbacks now validate issuer metadata through the v2 SDK. Discovery state and issuer-bound credentials persist across browser redirects and Durable Object hibernation.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="run-stateless-servers">Run stateless servers</h4><a class="anchor-link" href="#run-stateless-servers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>createMcpHandler</code> now accepts a factory that returns a server from <code>@modelcontextprotocol/server</code>. The factory creates an isolated server for each request.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { McpServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@modelcontextprotocol/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMcpHandler } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/mcp/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> createServer</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> McpServer</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"example"</span><span class="nb-shiki-140thh">, version: </span><span class="nb-shiki-mdbnqw">"1.0.0"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> createMcpHandler</span><span class="nb-shiki-140thh">(createServer)(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { McpServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@modelcontextprotocol/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMcpHandler } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/mcp/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> createServer</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> McpServer</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"example"</span><span class="nb-shiki-140thh">, version: </span><span class="nb-shiki-mdbnqw">"1.0.0"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> createMcpHandler</span><span class="nb-shiki-140thh">(createServer)(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>The isolated <code>agents/mcp/server</code> entry keeps <code>McpAgent</code>, <code>WorkerTransport</code>, MCP client transports, and SDK v1 modules out of stateless server bundles.</p> <p>The Workers wrapper validates present browser Origins, supports explicit delegation to trusted Origin middleware, and exposes request handling plus typed change notifications.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="backward-compatibility">Backward compatibility</h4><a class="anchor-link" href="#backward-compatibility"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The same <code>createMcpHandler(createServer)(request, env, ctx)</code> route serves MCP 2026-07-28 clients and legacy clients that use stateless requests. You do not need separate routes or tool definitions for ordinary tools, prompts, and resources.</p> <p><code>McpAgent</code> is deprecated and feature-frozen. Migrate existing <code>McpAgent</code> servers to the stateless handler at your earliest convenience. If a server depends on protocol sessions, RPC, pushed server-to-client requests, standalone streams, or replay, use the <a href="https://developers.cloudflare.com/agents/model-context-protocol/guides/migrate-to-mcp-sdk-v2/">migration guide</a> to design stateless equivalents and run both routes while clients transition.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="migrate-existing-sdk-v1-servers">Migrate existing SDK v1 servers</h4><a class="anchor-link" href="#migrate-existing-sdk-v1-servers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Upgrade the Agents SDK:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-npm" id="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-yarn" id="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-pnpm" id="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-bun" id="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-npm" aria-labelledby="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-yarn" aria-labelledby="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-pnpm" aria-labelledby="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-bun" aria-labelledby="pm-tab-pm-4daba157-f6f2-4c2f-8692-53511ebf5aab-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Move ordinary SDK v1 server definitions into an SDK v2 factory and serve them with <code>createMcpHandler</code>. The handler's default legacy compatibility means most stateless deployments need only one route.</p> <p>If an existing <code>McpAgent</code> server still needs sessionful features, add the stateless path beside it. Use <code>isLegacyRequest()</code> to send only legacy traffic to the existing route:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { isLegacyRequest } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@modelcontextprotocol/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMcpHandler } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/mcp/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { MyMcpAgent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./legacy-server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stateless</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createMcpHandler</span><span class="nb-shiki-140thh">(createServer, {</span></span> <span class="line"><span class="nb-shiki-140thh"> route: </span><span class="nb-shiki-mdbnqw">"/mcp"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> legacy: </span><span class="nb-shiki-mdbnqw">"reject"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> legacy</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> MyMcpAgent.</span><span class="nb-shiki-1t8gfj">serve</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/mcp"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> isLegacyRequest</span><span class="nb-shiki-140thh">(request)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> legacy.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> stateless</span><span class="nb-shiki-140thh">(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { isLegacyRequest } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@modelcontextprotocol/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMcpHandler } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/mcp/server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { MyMcpAgent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./legacy-server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stateless</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createMcpHandler</span><span class="nb-shiki-140thh">(createServer, {</span></span> <span class="line"><span class="nb-shiki-140thh"> route: </span><span class="nb-shiki-mdbnqw">"/mcp"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> legacy: </span><span class="nb-shiki-mdbnqw">"reject"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> legacy</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> MyMcpAgent.</span><span class="nb-shiki-1t8gfj">serve</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/mcp"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ExecutionContext</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> isLegacyRequest</span><span class="nb-shiki-140thh">(request)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> legacy.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> stateless</span><span class="nb-shiki-140thh">(request, env, ctx);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure></div></div></div></div> <p>Migrate the remaining sessionful features, allow existing sessions to drain, then remove the legacy route. Refer to <a href="https://developers.cloudflare.com/agents/model-context-protocol/guides/migrate-to-mcp-sdk-v2/">Migrate to MCP SDK v2</a> for package changes, compatibility limits, and rollout steps.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations-in-v0200">Deprecations in v0.20.0</h4><a class="anchor-link" href="#deprecations-in-v0200"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This release deprecates the following Agents SDK APIs:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Deprecated API</th> <th>Replacement</th> <th>Status</th> </tr> </thead> <tbody> <tr> <td><code>McpAgent</code></td> <td>Use an SDK v2 factory with <code>createMcpHandler</code> for stateless servers. Use the migration guide to replace stateful features before removing a legacy route.</td> <td>Feature-frozen. No removal version is announced.</td> </tr> <tr> <td><code>createMcpHandler(v1Server, options)</code></td> <td>Move the server to an SDK v2 factory and call <code>createMcpHandler(factory, options)</code>. Use <code>createLegacyMcpHandler</code> only as a temporary bridge for sessionful features.</td> <td>Scheduled for removal in the next major version.</td> </tr> <tr> <td><code>MCPClientManager.callTool(params, resultSchema, options)</code> and the equivalent <code>withX402Client</code> overload</td> <td>Use <code>callTool(params, options)</code> or <code>callTool(confirm, params, options)</code>.</td> <td>Compatibility overload. No removal version is announced.</td> </tr> </tbody> </table></div> <p>The MCP 2026-07-28 draft separately deprecates Roots, Sampling, Logging, the old HTTP+SSE transport, and Dynamic Client Registration.</p>Mon, 27 Jul 2026 00:00:00 GMTAgentsAgentsWorkersAudit Logs - Audit Logs v2 — Resource Historyhttps://developers.cloudflare.com/changelog/post/2026-07-27-audit-logs-v2-resource-history/https://developers.cloudflare.com/changelog/post/2026-07-27-audit-logs-v2-resource-history/<p>Audit Logs v2 now includes <strong>Resource History</strong>. For any audit log entry, you can see the sequence of previous changes to the same resource and view a side-by-side diff of what was modified.</p> <p>Resource History uses the audit log entries you already have. There is no additional configuration, no backend recapture, and no changes to how audit logs are generated.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1578,height=840,format=webp/_astro/Audit_logs_v2_resource_history.tpxHc9ML.png" alt="Resource History in Audit Logs v2" loading="lazy" decoding="async" width="1578" height="840"> <p><strong>Dashboard:</strong></p> <ol> <li>Go to <strong>Manage Account</strong> &gt; <strong>Audit Logs</strong>.</li> <li>Open any audit log entry.</li> <li>Select the <strong>History</strong> tab to see the full history for that resource.</li> <li>Select any earlier entry to see a side-by-side diff of the fields that changed between it and the current entry.</li> </ol> <p><strong>API:</strong></p> <p>Use the History endpoint to retrieve the change history for any audit log entry:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">GET https://api.cloudflare.com/client/v4/accounts/{account_id}/logs/audit/{id}/history</span></span></code></pre></figure> <p>The endpoint is also available for organization-scoped audit logs at <code>/organizations/{organization_id}/logs/audit/{id}/history</code>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/#resource-history">Resource History documentation</a>.</p>Mon, 27 Jul 2026 00:00:00 GMTAudit LogsAudit LogsWorkers - Run integration tests against your Worker's production buildhttps://developers.cloudflare.com/changelog/post/2026-07-21-integration-test-harness/https://developers.cloudflare.com/changelog/post/2026-07-21-integration-test-harness/ <p>Wrangler now provides <code>createTestHarness()</code>, an API for running integration tests against Workers built with <a href="https://developers.cloudflare.com/workers/testing/test-harness/configure/#configure-worker-projects">Wrangler or the Cloudflare Vite plugin</a> from any Node.js test runner.</p> <p>The test harness starts a local Worker server with <a href="https://developers.cloudflare.com/workers/wrangler/api/#createtestharness">helpers for dispatching requests, resetting storage, and inspecting runtime logs</a>.</p> <p>This is useful for tests that need to:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/testing/test-harness/interact-with-workers/#test-route-dispatch-across-workers">Route requests across multiple Workers</a></li> <li><a href="https://developers.cloudflare.com/workers/testing/test-harness/integrations/#mock-service-worker">Mock outbound <code>fetch()</code> requests</a> with Node.js request mocking libraries such as <a href="https://mswjs.io/" target="_blank" rel="noopener">MSW<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/workers/testing/test-harness/integrations/#playwright">Run Playwright tests against a Worker</a></li> </ul> <p>For example, this test starts two Workers and mocks an upstream API:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">tests/vitest.test.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { afterAll, afterEach, beforeAll, test } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { http, HttpResponse } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "msw"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { setupServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "msw/node"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createTestHarness } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "wrangler"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> network</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> setupServer</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createTestHarness</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> workers: [</span></span> <span class="line"><span class="nb-shiki-21nrsd"> /** Includes `"routes": ["example.com/*"]` */</span></span> <span class="line"><span class="nb-shiki-140thh"> { configPath: </span><span class="nb-shiki-mdbnqw">"./workers/web/wrangler.jsonc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> /** Includes `"routes": ["api.example.com/v1/*"]` */</span></span> <span class="line"><span class="nb-shiki-140thh"> { configPath: </span><span class="nb-shiki-mdbnqw">"./workers/api/wrangler.jsonc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">beforeAll</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">listen</span><span class="nb-shiki-140thh">({ onUnhandledRequest: </span><span class="nb-shiki-mdbnqw">"error"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">listen</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">afterEach</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">resetHandlers</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">reset</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">afterAll</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">test</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"routes requests to each Worker"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">expect</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Mock the outbound fetch used to load user profiles.</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">use</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> http.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://identity.example.com/profile/123"</span><span class="nb-shiki-140thh">, ({ </span><span class="nb-shiki-1jdh33">params</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> HttpResponse.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ id: </span><span class="nb-shiki-dzsirb">123</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Ada"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> apiWorkerResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "http://api.example.com/v1/users/123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> apiWorkerResponse.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toEqual</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> id: </span><span class="nb-shiki-dzsirb">123</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"Ada"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> webWorkerResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://example.com/users/123"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> webWorkerResponse.</span><span class="nb-shiki-1t8gfj">text</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Profile: Ada"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">tests/vitest.test.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { afterAll, afterEach, beforeAll, test } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { http, HttpResponse } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "msw"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { setupServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "msw/node"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createTestHarness } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "wrangler"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> network</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> setupServer</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createTestHarness</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> workers: [</span></span> <span class="line"><span class="nb-shiki-21nrsd"> /** Includes `"routes": ["example.com/*"]` */</span></span> <span class="line"><span class="nb-shiki-140thh"> { configPath: </span><span class="nb-shiki-mdbnqw">"./workers/web/wrangler.jsonc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> /** Includes `"routes": ["api.example.com/v1/*"]` */</span></span> <span class="line"><span class="nb-shiki-140thh"> { configPath: </span><span class="nb-shiki-mdbnqw">"./workers/api/wrangler.jsonc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">beforeAll</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">listen</span><span class="nb-shiki-140thh">({ onUnhandledRequest: </span><span class="nb-shiki-mdbnqw">"error"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">listen</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">afterEach</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">resetHandlers</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">reset</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">afterAll</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">test</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"routes requests to each Worker"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">expect</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Mock the outbound fetch used to load user profiles.</span></span> <span class="line"><span class="nb-shiki-140thh"> network.</span><span class="nb-shiki-1t8gfj">use</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> http.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://identity.example.com/profile/123"</span><span class="nb-shiki-140thh">, ({ </span><span class="nb-shiki-1jdh33">params</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> HttpResponse.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ id: </span><span class="nb-shiki-dzsirb">123</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Ada"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> apiWorkerResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "http://api.example.com/v1/users/123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> apiWorkerResponse.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toEqual</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> id: </span><span class="nb-shiki-dzsirb">123</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"Ada"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> webWorkerResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://example.com/users/123"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> webWorkerResponse.</span><span class="nb-shiki-1t8gfj">text</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Profile: Ada"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Cloudflare now recommends <code>createTestHarness()</code> for integration tests instead of <a href="https://developers.cloudflare.com/workers/testing/unstable_startworker/"><code>unstable_startWorker()</code></a> or <a href="https://developers.cloudflare.com/workers/wrangler/api/#unstable_dev"><code>unstable_dev()</code></a>. To start a development server programmatically, use the Vite <a href="https://vite.dev/guide/api-javascript.html#createserver" target="_blank" rel="noopener"><code>createServer()</code><span class="external-link"> ↗</span></a> API with the <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a>.</p> <p>For more information about <code>createTestHarness()</code>, refer to the <a href="https://developers.cloudflare.com/workers/testing/test-harness/">Integration test harness guide</a>.</p>Mon, 27 Jul 2026 00:00:00 GMTWorkersWorkersR2 - Sippy now supports Azure Blob Storage and S3-compatible storage providershttps://developers.cloudflare.com/changelog/post/2026-07-24-r2-sippy-azure-s3-compatible-support/https://developers.cloudflare.com/changelog/post/2026-07-24-r2-sippy-azure-s3-compatible-support/<p><a href="https://developers.cloudflare.com/r2/data-migration/sippy/">Sippy</a> can now incrementally migrate data from Azure Blob Storage and any S3-compatible object storage provider to <a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a>, in addition to Amazon S3 and Google Cloud Storage. Sippy copies objects to R2 as your application requests them, so you can start serving data from R2 without first moving your entire dataset or paying migration-specific egress fees.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enable-sippy">Enable Sippy</h4><a class="anchor-link" href="#enable-sippy"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Run the following command and follow the prompts to select and configure your source storage provider:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> sippy</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">BUCKET_NAM</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>For Azure Blob Storage, provide your storage account name, container name, and either an account key or a shared access signature (SAS) token with read and list permissions. For an S3-compatible provider, provide the S3 API endpoint URL and read-only Access Key ID and Secret Access Key.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=400,height=650,format=webp/_astro/sippy-azure-source-configuration.j9uacYgX.png" alt="Azure Blob Storage source configuration in the R2 dashboard" loading="lazy" decoding="async" width="400" height="650"> <p>After you enable Sippy, requests for objects that are not yet in R2 are served from your source bucket and copied to R2. Subsequent requests for those objects are served from R2.</p> <p>For setup instructions and credential requirements, refer to the <a href="https://developers.cloudflare.com/r2/data-migration/sippy/">Sippy documentation</a>.</p>Fri, 24 Jul 2026 00:00:00 GMTR2R2Workers - Workers Builds now skips superseded queued buildshttps://developers.cloudflare.com/changelog/post/2026-07-24-skip-superseded-builds/https://developers.cloudflare.com/changelog/post/2026-07-24-skip-superseded-builds/<p>Workers Builds now automatically skips a queued build when a newer build for the same build trigger is also queued.</p>Fri, 24 Jul 2026 00:00:00 GMTWorkersWorkersAgents - Agents SDK packages support AI SDK v6 and v7https://developers.cloudflare.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/https://developers.cloudflare.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/ <p>The <code>agents</code>, <code>@cloudflare/ai-chat</code>, <code>@cloudflare/codemode</code>, and <code>@cloudflare/think</code> packages now support AI SDK v6 and v7. Existing applications can remain on v6 when updating these packages. Applications can also adopt v7 without changing the Cloudflare Agents APIs they use.</p> <p>The supported peer ranges are <code>ai@^6 || ^7</code> and <code>@ai-sdk/react@^3 || ^4</code>. Use matching major versions: pair AI SDK v6 with <code>@ai-sdk/react</code> v3, or pair AI SDK v7 with <code>@ai-sdk/react</code> v4.</p> <p>To install the latest packages with AI SDK v7:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-npm" id="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-yarn" id="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-pnpm" id="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-bun" id="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-npm" aria-labelledby="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-yarn" aria-labelledby="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-pnpm" aria-labelledby="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c9abee93-5bde-4948-9345-fe12a67602db-bun" aria-labelledby="pm-tab-pm-c9abee93-5bde-4948-9345-fe12a67602db-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Think normalizes streaming, tool completion events, and telemetry across both AI SDK versions. Existing v6 applications do not need to migrate these integrations before updating Think.</p> <p>For setup and usage details, refer to the <a href="https://developers.cloudflare.com/agents/harnesses/think/">Think documentation</a>.</p>Thu, 23 Jul 2026 00:00:00 GMTAgentsAgentsAgents, Workers - Agents SDK reduces MCP schema conversion, adds exposure controls for MCP in Think and Code Mode SDK adds direct host APIshttps://developers.cloudflare.com/changelog/post/2026-07-22-mcp-codemode-updates/https://developers.cloudflare.com/changelog/post/2026-07-22-mcp-codemode-updates/ <p>This release reduces repeated MCP schema conversion and adds an opt-out for Think's automatic MCP tool exposure. It also lets non-AI-SDK hosts invoke the durable Code Mode runtime directly.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="control-direct-mcp-tool-exposure-in-think">Control direct MCP tool exposure in Think</h4><a class="anchor-link" href="#control-direct-mcp-tool-exposure-in-think"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agents SDK MCP clients now reuse converted input and output schemas while a live connection keeps the same tool catalog. This avoids converting every MCP JSON Schema to Zod again for each model turn.</p> <p><code>@cloudflare/think</code> also adds <code>includeMcpTools</code>. Set it to <code>false</code> when you expose MCP tools through Code Mode or another mechanism outside Think's automatic tool set:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> includeMcpTools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> includeMcpTools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>This setting skips Think's automatic <code>getAITools()</code> call. MCP registration, restoration, discovery, raw catalog access, direct calls, and Code Mode connectors continue to work.</p> <p>Use <a href="https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/#thismcplisttools"><code>listTools()</code></a> when you only need the raw MCP catalog. For connector setup, refer to <a href="https://developers.cloudflare.com/agents/tools/codemode/mcp/">Use MCP tools with Code Mode</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="invoke-the-code-mode-runtime-without-the-ai-sdk">Invoke the Code Mode runtime without the AI SDK</h4><a class="anchor-link" href="#invoke-the-code-mode-runtime-without-the-ai-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/codemode@latest</code> adds <code>execute()</code>, <code>search()</code>, and <code>describe()</code> to the durable runtime handle. MCP servers and other hosts can now execute code and discover connector methods without adapting the runtime to an AI SDK tool.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> matches</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"create issue"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> docs</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">describe</span><span class="nb-shiki-140thh">(matches.results[</span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">].path);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> outcome</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">execute</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> code: </span><span class="nb-shiki-mdbnqw">`async () => github.create_issue({ title: "Bug" })`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> matches</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"create issue"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> docs</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">describe</span><span class="nb-shiki-140thh">(matches.results[</span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">].path);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> outcome</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> runtime.</span><span class="nb-shiki-1t8gfj">execute</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> code: </span><span class="nb-shiki-mdbnqw">`async () =&gt; github.create_issue({ title: "Bug" })`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Search and describe results include <code>requiresApproval: true</code> for protected connector methods. Resolve a paused execution with the existing <code>approve()</code> and <code>reject()</code> methods.</p> <p>For setup and exact method types, refer to <a href="https://developers.cloudflare.com/agents/tools/codemode/durable-runtime/">Create a durable Code Mode runtime</a> and the <a href="https://developers.cloudflare.com/agents/tools/codemode/api-reference/">Code Mode API reference</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-npm" id="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-yarn" id="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-pnpm" id="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-bun" id="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-npm" aria-labelledby="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-yarn" aria-labelledby="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-pnpm" aria-labelledby="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-54038d93-4448-4528-af9b-9ce626f0ba33-bun" aria-labelledby="pm-tab-pm-54038d93-4448-4528-af9b-9ce626f0ba33-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script>Wed, 22 Jul 2026 00:00:00 GMTAgentsAgentsWorkersCloudflare One Client - Cloudflare One Client for Windows (version 2026.6.880.0)https://developers.cloudflare.com/changelog/post/2026-07-21-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-07-21-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This hotfix resolves a regression that caused a large increase in DNS-over-TCP queries to fallback and internal DNS servers. The client now sends fallback DNS queries over UDP first, falling back to TCP only when a response is truncated, instead of querying both protocols in parallel.</p> Tue, 21 Jul 2026 16:55:55 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for macOS (version 2026.6.880.0)https://developers.cloudflare.com/changelog/post/2026-07-21-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-07-21-warp-macos-ga/<p>A new GA release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This hotfix resolves a regression that caused a large increase in DNS-over-TCP queries to fallback and internal DNS servers. The client now sends fallback DNS queries over UDP first, falling back to TCP only when a response is truncated, instead of querying both protocols in parallel.</p> Tue, 21 Jul 2026 16:55:55 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Linux (version 2026.6.880.0)https://developers.cloudflare.com/changelog/post/2026-07-21-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-07-21-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This hotfix resolves a regression that caused a large increase in DNS-over-TCP queries to fallback and internal DNS servers. The client now sends fallback DNS queries over UDP first, falling back to TCP only when a response is truncated, instead of querying both protocols in parallel.</p> Tue, 21 Jul 2026 16:50:41 GMTCloudflare One ClientCloudflare One ClientCloudflare Fundamentals - Account Role API deprecatedhttps://developers.cloudflare.com/changelog/post/2026-07-21-account-role-api-deprecated/https://developers.cloudflare.com/changelog/post/2026-07-21-account-role-api-deprecated/<p>The <a href="https://developers.cloudflare.com/api/resources/accounts/subresources/roles/">Account Roles API</a> is deprecated and is being replaced by the <a href="https://developers.cloudflare.com/api/resources/iam/subresources/permission_groups/">Permission Groups API</a>. An end of life date has not yet been established.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-need-to-do">What you need to do</h4><a class="anchor-link" href="#what-you-need-to-do"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Review the <a href="https://developers.cloudflare.com/api/resources/iam/subresources/permission_groups/">Permission Groups API</a> documentation; the response schema differs from the legacy Roles response.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="highlights">Highlights</h4><a class="anchor-link" href="#highlights"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Integrations migrating to the Permission Groups API must obtain Permission Group IDs from that API and use them in the Account Members API policies request shape. Integrations that persist legacy Role IDs will need to remap their assignments.</li> <li>The legacy <code>Role</code> response includes a top-level <code>description</code> and a <code>permissions</code> object keyed by resource type with edit/read flags.</li> <li>The <code>PermissionGroup</code> response replaces those with a <code>meta</code> object containing <code>label</code> and <code>scopes</code>. Individual permissions are not returned as part of the permission group.</li> <li>The new API supports the <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">API Token</a> authorization scheme. The legacy Email + API Key authorization schema is provided for backwards compatibility.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/api/reference/deprecations/">API deprecations</a>.</p>Tue, 21 Jul 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsSandbox SDK - Run Devin on Cloudflare using Devin Outpostshttps://developers.cloudflare.com/changelog/post/2026-07-21-devin-outposts/https://developers.cloudflare.com/changelog/post/2026-07-21-devin-outposts/<p><a href="https://docs.devin.ai/onboard-devin/outposts" target="_blank" rel="noopener">Devin Outposts<span class="external-link"> ↗</span></a> lets you run Devin agents on Cloudflare. Each Devin session runs in its own isolated sandbox backed by <a href="https://developers.cloudflare.com/containers/">Cloudflare Containers</a>, so agents can execute code and use development tooling in an isolated environment.</p> <p>Use Devin Outposts when you want Devin sessions to run on Cloudflare managed infrastructure, with each session isolated from the others.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=914,format=webp/_astro/devin-outposts.B3xjmfR5.jpg" alt="Devin interface showing Cloudflare selected as an Outposts virtual environment" loading="lazy" decoding="async" width="1712" height="914"> <p>To get started, refer to <a href="https://developers.cloudflare.com/sandbox/tutorials/devin-outposts/">Run Devin on Cloudflare using Devin Outposts</a>.</p>Tue, 21 Jul 2026 00:00:00 GMTSandbox SDKSandbox SDKSSL/TLS - Faster and more secure TLS handshakes to your origins, automaticallyhttps://developers.cloudflare.com/changelog/post/2026-07-21-automatic-origin-key-exchange/https://developers.cloudflare.com/changelog/post/2026-07-21-automatic-origin-key-exchange/<p>Cloudflare now takes the guesswork out of TLS 1.3 key agreement with your origins. Automatic key exchange predicts the preferred algorithm and sends its key share in the first <code>ClientHello</code>, helping avoid a <code>HelloRetryRequest</code> and one extra network round trip.</p> <p>Automatic key exchange is on for all existing zones and on by default for new zones. When an origin supports both classical and post-quantum key agreements, Cloudflare prefers the post-quantum <code>X25519MLKEM768</code> hybrid key agreement.</p> <p>To change this behavior, go to <strong>SSL/TLS</strong> &gt; <strong>Overview</strong> &gt; <strong>Origin connection &amp; post-quantum encryption</strong>. Turn off <strong>Automatic key exchange</strong> to stop automatic scans and preference updates. Turning it off does not change your compliance requirements.</p> <p><strong>Compliance requirements</strong> apply only to TLS 1.3 connections. The <strong>Post-quantum hybrid</strong> option requires hybrid post-quantum key agreements support on your origin server. The <strong>Federal Information Processing Standards (FIPS)</strong> option requires FIPS-compliant key agreements. Select both to require key agreements that satisfy both, or leave both unselected to allow all supported key agreements.</p> <p>For requirements, configuration options, and rollout details, refer to <a href="https://developers.cloudflare.com/ssl/origin-configuration/automatic-key-exchange/">Automatic key exchange to origins</a>.</p>Tue, 21 Jul 2026 00:00:00 GMTSSL/TLSSSL/TLSWAF - WAF Release - 2026-07-21https://developers.cloudflare.com/changelog/post/2026-07-21-waf-release/https://developers.cloudflare.com/changelog/post/2026-07-21-waf-release/ <p>This release introduces new rules for vulnerabilities in Adobe ColdFusion, Next.js, WordPress alongside updates to existing rules thereby providing enhanced generic protections against Server-Side Request Forgery (SSRF), Local File Inclusion (LFI), and Cross-Site Scripting (XSS).</p> <p><strong>WAF and framework adapter mitigations for Next.js vulnerabilities</strong></p> <p>Multiple <a href="https://nextjs.org/blog/july-2026-security-release" target="_blank" rel="noopener">security vulnerabilities<span class="external-link"> ↗</span></a> were disclosed and patched by the Next.js team through July 2026 security release. These include denial of service, middleware and proxy bypass, server-side request forgery, information disclosure, and cache poisoning across a range of severities.</p> <p>Several of the disclosed vulnerabilities are not possible to block at WAF layer,we strongly recommend updating your application and its dependencies immediately. Patched versions are available through v16.2.11 (Active LTS) and v15.5.21 (Maintenance LTS) to address these issues.</p> <table style="width: 100%"><thead><tr><th>Advisory</th><th>CVE</th><th>Severity</th><th>Issue</th><th>WAF Coverage</th></tr></thead><tbody><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-m99w-x7hq-7vfj">Denial of Service in App Router using Server Actions</a></td><td>CVE-2026-64641</td><td>High</td><td><p>Crafted requests targeting Next.js applications using App Router with at least one Server Action can lead to excessive CPU usage. The CPU usage blocks processing of further requests in the same process, leading to Denial of Service.</p></td><td><p>WAF rule Next.js - DoS - CVE-2026-64641 (<rule-id id="b013b67c357547b4b866234390dcdb0a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...90dcdb0a</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script>) has been deployed to provide coverage.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-6gpp-xcg3-4w24">Middleware / Proxy bypass in App Router applications using Turbopack and single locale</a></td><td>CVE-2026-64642</td><td>High</td><td><p>Next.js applications using App Router built with Turbopack and a single entry in config.i18n.locales are vulnerable to a middleware/proxy bypass. Accordingly, any authentication or security checks that a middleware/proxy may perform are bypassed.</p></td><td><p>This is a middleware bypass that unfortunately cannot be covered through Cloudflare WAF signature engine.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-p9j2-gv94-2wf4">Server-Side Request Forgery in rewrites via attacker-controlled destination hostname</a></td><td>CVE-2026-64645</td><td>High</td><td><p>A rewrites() or redirects() rule that builds its external destination hostname from request-controlled input can be pointed at an arbitrary hostname, regardless of the rule's hostname suffix. For rewrites, this behavior enables Server-Side Request Forgery (SSRF); for redirects, Open Redirect can be achieved.</p></td><td><p>Existing SSRF rules provide adequate coverage for this vulnerability, no tailored WAF rule was developed.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-89xv-2m56-2m9x">Server-Side Request Forgery in Server Actions on custom servers</a></td><td>CVE-2026-64649</td><td>High</td><td><p>When a Server Action forwards or redirects a request, an attacker can cause the server to send that outbound request to a malicious host (Server-Side Request Forgery). This requires the attacker’s request to control Host-associated headers.</p></td><td><p>WAF rule Next.js - SSRF - CVE-2026-64649 (<rule-id id="7fe6d6f3df774ae2a0011f20930091a3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...930091a3</span></button></rule-id>) has been deployed to provide coverage.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-q8wf-6r8g-63ch">Denial of Service in the Image Optimization API using SVGs</a></td><td>CVE-2026-64644</td><td>Medium</td><td><p>When self-hosting Next.js with the default image loader, the Image Optimization API can optimize remotely hosted images if configured (not enabled by default). If those images contain malicious content, the images can cause CPU exhaustion in the /_next/image endpoint.</p></td><td><p>Malicious request is unfortunately indistinguishable from a legitimate image optimization request, so no WAF rule has been created to address this vulnerability.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-4c39-4ccg-62r3">Unbounded Server Action payload in Edge runtime</a></td><td>CVE-2026-64646</td><td>Medium</td><td><p>A crafted request can lead to memory consumption on Server Actions in the Edge runtime. Next.js applications which use App Router and have at least one Server Action are affected.</p></td><td><p>Unfortunately there is no one size fits all rule that can be deployed through WAF in lieu of custom bodySizeLimit configurations, so no WAF rule has been created to address this vulnerability.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-955p-x3mx-jcvp">Unauthenticated disclosure of internal Server Function endpoints</a></td><td>CVE-2026-64643</td><td>Medium</td><td><p>In Next.js applications using App Router, Server Actions (use server) or use cache endpoint IDs can be globally disclosed. An attacker can use this for reconnaissance and as part of a broader attack chain.</p></td><td><p>WAF rule Next.js - Information Disclosure - CVE-2026-64643 (<rule-id id="6c4135d4d9d745e4866ad83672952826"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...72952826</span></button></rule-id>) has been deployed to provide coverage.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-68g3-v927-f742">Cache confusion of response bodies for requests with bodies</a></td><td>CVE-2026-64648</td><td>Medium</td><td><p>A server-side fetch with a request body may return a cached response body from a different request to the same URL but different body. This only applies for fetch calls of the shape fetch(new Request(init), aDifferentInit)</p></td><td><p>This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.</p></td></tr><tr><td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-4633-3j49-mh5q">Cache confusion of response bodies for requests with bodies containing invalid UTF-8 byte sequences</a></td><td>CVE-2026-64647</td><td>Medium</td><td><p>A server-side fetch with a request body may return a cached response body from a different request to the same URL but different body. This only applies when receiving request bodies which contain invalid UTF-8 characters.</p></td><td><p>This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.</p></td></tr></tbody></table> <p><strong>Key Findings</strong></p> <ul> <li> <p>CVE-2026-48276: A path traversal vulnerability in Adobe ColdFusion file upload mechanisms allows unauthenticated attackers to write or upload files to arbitrary locations outside designated directories on the origin server.</p> </li> <li> <p>CVE-2026-48282: A path traversal vulnerability in Adobe ColdFusion enables unauthenticated attackers to manipulate directory sequences and access restricted system files on the host filesystem.</p> </li> <li> <p>CVE-2026-60137: An unauthenticated SQL injection vulnerability affecting WordPress. Threat actors exploit unsanitized input parameters to execute arbitrary SQL queries, leading to unauthorized database access, record manipulation, or data exfiltration.</p> </li> <li> <p>CVE-2026-63030: A remote code execution vulnerability affecting WordPress core and plugin components. Remote, unauthenticated attackers can execute arbitrary system commands to gain unauthorized access or establish backdoors on host servers.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7fbdc9407bdb4a4eae2b3d91215e7d31"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...215e7d31</span></button></rule-id></td><td>N/A</td><td>SSRF - Restricted Protocol</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6ca512d240d848d6a0c7ef42a935ee5d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a935ee5d</span></button></rule-id></td><td>N/A</td><td>SSRF - Obfuscated Host</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a3fb0870c38440d8a9a0eba81b0230ac"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1b0230ac</span></button></rule-id></td><td>N/A</td><td>LFI - Path Traversal</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="452a04be3f73458c863d8dae61349c8b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...61349c8b</span></button></rule-id></td><td>N/A</td><td>Adobe ColdFusion - File Upload Path Traversal - CVE:CVE-2026-48276</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a53a3fb491c64d74908081ee9cb61eac"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9cb61eac</span></button></rule-id></td><td>N/A</td><td>Adobe ColdFusion - Path Traversal - CVE:CVE-2026-48282</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d8b63828c2344d919b94d2594ac5e21f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4ac5e21f</span></button></rule-id></td><td>N/A</td><td>XSS — JS Bracket Concat Obfuscation - Body</td><td>Log</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="264a83a764be428ca41d516ff31f5559"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f31f5559</span></button></rule-id></td><td>N/A</td><td>XSS — JS Bracket Concat Obfuscation - Headers</td><td>Log</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4ba21a60837244029183b782987984fd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...987984fd</span></button></rule-id></td><td>N/A</td><td>XSS — JS Bracket Concat Obfuscation - URI</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1c060d3a371549219ee290d7ed933fcc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ed933fcc</span></button></rule-id></td><td>N/A</td><td>Wordpress - SQL Injection - CVE:CVE-2026-60137</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - SQLi.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7dfb2bd4708d4b88b9911dc0550664b6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...550664b6</span></button></rule-id></td><td>N/A</td><td>Wordpress - Remote Code Execution - CVE:CVE-2026-63030</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - Unauthenticated RCE.</p></td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="db003b39b7774859a8d588ce33697a1a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...33697a1a</span></button></rule-id></td><td>N/A</td><td>Wordpress - SQL Injection - CVE:CVE-2026-60137</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - SQLi.</p></td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="ebd3f2df15c74ddcbf6220c9b5ec246a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b5ec246a</span></button></rule-id></td><td>N/A</td><td>Wordpress - Remote Code Execution - CVE:CVE-2026-63030</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - Unauthenticated RCE.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6c4135d4d9d745e4866ad83672952826"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...72952826</span></button></rule-id></td><td>N/A</td><td>Next.js - Information Disclosure - CVE-2026-64643</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - Information Disclosure.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7fe6d6f3df774ae2a0011f20930091a3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...930091a3</span></button></rule-id></td><td>N/A</td><td>Next.js - SSRF - CVE-2026-64649</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - Auth Bypass - 2.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c4ca56c0a6a348299d5a93e663167195"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...63167195</span></button></rule-id></td><td>N/A</td><td>Next.js - Remote Code Execution - Cache Components</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - RCE.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b013b67c357547b4b866234390dcdb0a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...90dcdb0a</span></button></rule-id></td><td>N/A</td><td>Next.js - DoS - CVE-2026-64641</td><td>N/A</td><td>Block</td><td><p>This was labeled as Generic Rules - DoS.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="aa21c9b8b97743bfb217748b2049a60c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2049a60c</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - Body - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e7ee67e824844754b513cdf3836855a4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...836855a4</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - Header - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5f2a6681a2b94442b23816286d060a0d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6d060a0d</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - URI - Beta</td><td>Disabled</td><td> - </td><td><p>This detection has been removed.</p></td></tr></tbody></table>Tue, 21 Jul 2026 00:00:00 GMTWAFWAFAccess - Browser-based login for plaintext HTTP private applicationshttps://developers.cloudflare.com/changelog/post/2026-07-20-http-private-apps-l7-auth/https://developers.cloudflare.com/changelog/post/2026-07-20-http-private-apps-l7-auth/<p>Cloudflare Access now uses the standard browser-based login flow for <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/">private applications</a> served over plaintext HTTP on port <code>80</code>.</p> <p>Previously, plaintext HTTP private apps fell back to the same session flow used for SSH, RDP, and other non-HTTP protocols: users got an <code>Authentication required</code> pop-up from the Cloudflare One Client, then had to select the notification to open a browser and log in. Now, users hitting an HTTP private app see the Access login page directly in the browser and receive a standard Access <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/authorization-cookie/application-token/">application token</a> on success.</p> <p>This brings the HTTP experience in line with HTTPS apps (with <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tls-decryption/">Gateway TLS decryption</a> turned on). No configuration change is required. The Cloudflare One Client is still required to route traffic to the private network, but it no longer manages the Access session for HTTP apps.</p> <p>Other non-HTTP protocols (SSH, RDP, arbitrary TCP/UDP) continue to use the Cloudflare One Client notification flow.</p>Mon, 20 Jul 2026 00:00:00 GMTAccessAccessBilling, Workers - Budget alerts now on by default for Pay-as-you-go accountshttps://developers.cloudflare.com/changelog/post/2026-06-15-budget-alerts-default-on/https://developers.cloudflare.com/changelog/post/2026-06-15-budget-alerts-default-on/<p>We are turning on budget alerts by default for eligible Pay-as-you-go accounts. If your account does not already have a budget alert, Cloudflare will create one for you with a $10 account-level threshold. Your default alert will enable at the turn of your next billing cycle, so it will not fire based on usage you have already incurred.</p> <p>We are rolling this out in cohorts over the coming weeks, so eligible accounts may see their default alert appear at different times.</p> <p>The default alert behaves exactly like an alert you would create yourself. When your cumulative usage-based spend this cycle reaches the threshold, you receive an email notification. The alert is informational only. It does not cap your usage or impact your account in any way.</p> <p>Usage is processed once per day for the prior day's activity, so budget alerts fire the day after the threshold is reached rather than in real time.</p> <p>Budget alerts only consider spend on usage-based products. Recurring subscription fees, such as the Workers Paid plan fee or other monthly plan charges, are not included in the threshold calculation.</p> <p>You can change the threshold, add additional alerts, or remove the default alert entirely from <strong>Manage Account</strong> &gt; <strong>Billing</strong> &gt; <strong>Billable Usage</strong>, or from your Notifications settings. If you already configured your own budget alert, nothing changes.</p> <p>Enterprise contract accounts are not in scope.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/billing/manage/budget-alerts/">Budget alerts documentation</a>.</p>Mon, 20 Jul 2026 00:00:00 GMTBillingBillingWorkersDurable Objects, Workers - View total SQLite storage for Durable Object namespaceshttps://developers.cloudflare.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/https://developers.cloudflare.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/ <p>You can now monitor the total SQLite storage used by a Durable Object namespace over time in the Cloudflare dashboard. The new <strong>Total storage</strong> chart shows the maximum storage reported during each hour. This helps you identify storage growth, validate data cleanup, and investigate unexpected usage.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1436,height=846,format=webp/_astro/durable-objects-total-storage.Cr_F72Yz.png" alt="The Total storage chart showing a Durable Object namespace growing to 260.1 MB of storage over time." loading="lazy" decoding="async" width="1436" height="846"><a href="https://dash.cloudflare.com/?to=/:account/workers/durable-objects" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Durable Objects</strong>&nbsp;&#8599;</a> <p>The chart appears only for SQLite-backed Durable Object namespaces. It does not appear for namespaces that use the legacy key-value storage backend. Viewing storage for individual Durable Objects by ID or name is not supported.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/durable-objects/observability/metrics-and-analytics/#total-storage">Metrics and analytics</a>.</p>Mon, 20 Jul 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Restart, reboot, or shut down a Cloudflare One Appliance from the dashboardhttps://developers.cloudflare.com/changelog/post/2026-07-17-appliance-restart-reboot-shutdown/https://developers.cloudflare.com/changelog/post/2026-07-17-appliance-restart-reboot-shutdown/<p>You can now restart, reboot, or shut down a <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/">Cloudflare One Appliance</a> directly from the dashboard or via API.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=948,format=webp/_astro/2026-07-17-appliance-restart-reboot-shutdown.DKqTLOh6.gif" alt="Restarting a Cloudflare One Appliance from the Operations section of the Edit Appliance page" loading="lazy" decoding="async" width="1800" height="948"> <ul> <li><strong>Restart</strong> — Restart managed services. Purges temporary and (optionally) persistent state.</li> <li><strong>Reboot</strong> — Power cycle the appliance. Optionally, purge persistent state. Re-applies configuration starting from scratch.</li> <li><strong>Shutdown</strong> — Power off the appliance. Optionally, purge persistent state. The machine will be offline until manually powered on again.</li> </ul> <p>In the dashboard, go to <strong>Networking</strong> &gt; <strong>Connectors</strong> &gt; <strong>Appliances</strong>, select an appliance, then <strong>Edit</strong> &gt; <strong>Operations</strong> to send an operation. Via API, <code>POST</code> to the <code>/accounts/{account_id}/magic/connectors/{connector_id}/interrupts</code> endpoint.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/maintenance/appliance-operations/">Appliance operations</a>.</p>Fri, 17 Jul 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANEmail Service - Preview sent emails in the Activity loghttps://developers.cloudflare.com/changelog/post/2026-07-17-email-message-preview/https://developers.cloudflare.com/changelog/post/2026-07-17-email-message-preview/<p>You can now preview the content of sent emails directly from the Email Service Activity log. Expand a sent email and open the new <strong>Preview</strong> section to inspect the message as it was sent, across tabs for the rendered <strong>HTML</strong> body, the <strong>Text</strong> body, the <strong>Headers</strong>, the <strong>Attachments</strong>, and the full <strong>Raw</strong> <a href="https://datatracker.ietf.org/doc/html/rfc5322" target="_blank" rel="noopener">RFC 5322<span class="external-link"> ↗</span></a> source.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2864,height=1172,format=webp/_astro/email-message-preview.Bj6Lk8Y6.png" alt="The rendered HTML preview of a sent email in the Email Service Activity log" loading="lazy" decoding="async" width="2864" height="1172"> <p>Previously, the Activity log surfaced delivery and authentication metadata but not the message content, making rendering and content issues harder to debug. Message preview closes that gap.</p> <p>To make messages previewable, turn on <strong>Email preview</strong> in your sending domain's settings. Previews cover messages sent while the setting is turned on and are retained for about seven days. Sending domains onboarded on or after 2026-07-02 have <strong>Email preview</strong> turned on automatically.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2256,height=264,format=webp/_astro/email-preview-setting.XEd1WIiO.png" alt="The Email preview setting in a sending domain's settings" loading="lazy" decoding="async" width="2256" height="264"> <p>Refer to <a href="https://developers.cloudflare.com/email-service/observability/logs/#message-preview">Email logs</a> for more information.</p>Fri, 17 Jul 2026 00:00:00 GMTEmail ServiceEmail ServiceGateway - New header control options for Gateway HTTP policieshttps://developers.cloudflare.com/changelog/post/2026-07-17-http-request-header-manipulation/https://developers.cloudflare.com/changelog/post/2026-07-17-http-request-header-manipulation/<p>Cloudflare Gateway now supports advanced header control on <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#allow">Allow policies</a>. Administrators can add, overwrite, or delete headers on matching requests using static values or dynamic variables.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="header-operations">Header operations</h4><a class="anchor-link" href="#header-operations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Gateway HTTP policies using the Allow action support three operations in <code>rule_settings</code>:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Operation</th> <th>API field</th> <th>Behavior</th> </tr> </thead> <tbody> <tr> <td>Add</td> <td><code>add_headers</code></td> <td>Appends a value to the header. Existing values are preserved.</td> </tr> <tr> <td>Overwrite</td> <td><code>set_headers</code></td> <td>Replaces the header value. Creates the header if it does not exist.</td> </tr> <tr> <td>Delete</td> <td><code>delete_headers</code></td> <td>Removes the header from the request.</td> </tr> </tbody> </table></div> <p>Gateway applies operations in order: delete, then overwrite, then add.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dynamic-variables">Dynamic variables</h4><a class="anchor-link" href="#dynamic-variables"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Header values can include dynamic variables using the <code>@{...}</code> syntax. Gateway resolves variables at request time from identity, device, and network context.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Variable</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>@{identity.email}</code></td> <td>User email from the identity provider</td> </tr> <tr> <td><code>@{identity.name}</code></td> <td>User display name from the identity provider</td> </tr> <tr> <td><code>@{identity.id}</code></td> <td>Cloudflare identity UUID</td> </tr> <tr> <td><code>@{identity.groups}</code></td> <td>Identity provider group memberships</td> </tr> <tr> <td><code>@{identity.SAML}</code></td> <td>SAML attributes (if configured)</td> </tr> <tr> <td><code>@{identity.OIDC}</code></td> <td>OIDC claims (if configured)</td> </tr> <tr> <td><code>@{source.ip}</code></td> <td>Source IP of the connection</td> </tr> <tr> <td><code>@{destination.ip}</code></td> <td>Destination IP of the request</td> </tr> <tr> <td><code>@{device.id}</code></td> <td>Cloudflare One Client device UUID</td> </tr> <tr> <td><code>@{device.posture}</code></td> <td>Device posture check results (JSON string)</td> </tr> </tbody> </table></div> <p>You can mix static text and dynamic variables in a single header value. For example, <code>user-@{identity.email}</code> resolves to <code>user-jdoe@example.com</code>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tenant-control/">Custom headers</a>.</p>Fri, 17 Jul 2026 00:00:00 GMTGatewayGatewayCloudflare Fundamentals, Organizations - Distributor, MSSP, and Agency partners can manage Organization members directlyhttps://developers.cloudflare.com/changelog/post/2026-07-17-distributor-mssp-self-serve-members/https://developers.cloudflare.com/changelog/post/2026-07-17-distributor-mssp-self-serve-members/<p>Distributor, MSSP, and Agency partners on Cloudflare <a href="https://developers.cloudflare.com/fundamentals/organizations/">Organizations</a> can now add and manage Organization Members directly from the Cloudflare dashboard, without help from Cloudflare.</p> <p>Previously, adding a member to a Distributor, MSSP, or Agency Organization was a manual, Cloudflare-assisted process that required a request to Cloudflare and enrollment in a closed beta, and the dashboard <strong>Add member</strong> flow was blocked for these Organizations.</p> <p>Now, Organization admins can add members themselves from <strong>Organization</strong> &gt; <strong>Members</strong> &gt; <strong>Add member</strong>, with no beta enrollment required.</p> <p>New members receive access to the Organization's accounts through the same implicit-access model already used for enterprise Organizations. The <strong>Accounts</strong> list and the account switcher classify Distributor, MSSP, and Agency Organizations consistently with enterprise Organizations, so their accounts are labeled and grouped correctly in the dashboard.</p> <p>Agency partners also gain access to the Organizations dashboard, while retaining access to their existing Tenant management dashboard.</p> <p>Distributor, MSSP, and Agency Organizations are currently in beta.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/organizations/manage-members/">Manage Organization members</a>.</p>Fri, 17 Jul 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsOrganizationsWAF - WAF Release - 2026-07-17 - Emergencyhttps://developers.cloudflare.com/changelog/post/2026-07-17-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2026-07-17-emergency-waf-release/ <p>This emergency release adds a new managed rule to block active exploitation of a critical remote code execution (RCE) and SQL injection (SQLi) vulnerability found in popular web frameworks.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Generic Frameworks - Unauthenticated RCE: Attackers can execute arbitrary system commands with web server privileges by sending malicious input containing invalid path sequences during request processing.</p> </li> <li> <p>Generic Frameworks - SQLi: Attackers can execute unauthorized database queries due to a failure to sanitize input values within request parameters.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7dfb2bd4708d4b88b9911dc0550664b6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...550664b6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Generic Rules - Unauthenticated RCE</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1c060d3a371549219ee290d7ed933fcc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ed933fcc</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi </td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="ebd3f2df15c74ddcbf6220c9b5ec246a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b5ec246a</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Unauthenticated RCE </td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="db003b39b7774859a8d588ce33697a1a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...33697a1a</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi </td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Fri, 17 Jul 2026 00:00:00 GMTWAFWAFAccess, Cloudflare One - Bulk print PDFs for browser-based RDPhttps://developers.cloudflare.com/changelog/post/2026-07-16-rdp-bulk-print/https://developers.cloudflare.com/changelog/post/2026-07-16-rdp-bulk-print/<p>Users in browser-based RDP sessions can now print multiple PDF files as a single print job. Copy the files to your clipboard on the remote machine, then select <strong>Print all PDFs</strong> in the clipboard panel. The files are combined into one PDF and sent to your local printer.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=768,height=432,format=webp/_astro/rdp-bulk-print.DT4sCcI-.png" alt="The clipboard panel showing the Print all PDFs option for multiple selected PDF files." loading="lazy" decoding="async" width="768" height="432"> <p>Bulk print is available in Chromium-based browsers and Firefox. For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#print-pdfs">Print PDFs for browser-based RDP</a>.</p>Thu, 16 Jul 2026 00:00:00 GMTAccessAccessCloudflare OneFlagship - Manage Flagship from the command line with Wranglerhttps://developers.cloudflare.com/changelog/post/2026-07-16-wrangler-commands/https://developers.cloudflare.com/changelog/post/2026-07-16-wrangler-commands/<p><strong><a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a></strong> now includes <code>wrangler flagship</code>, a command suite for managing <a href="https://developers.cloudflare.com/flagship/">Flagship</a> apps and feature flags from your terminal.</p> <p>Create an app and, if you use it from a Worker, add it to your <code>wrangler.json</code> or <code>wrangler.jsonc</code> file as a binding:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> apps</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> "My Worker App"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --binding</span><span class="nb-shiki-mdbnqw"> FLAGS</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --update-config</span></span></code></pre></figure> <p>Then create flags for the behavior you want to control. Flags can be booleans, strings, numbers, or JSON values:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> new-checkout</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --variation</span><span class="nb-shiki-mdbnqw"> control=old-checkout</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --variation</span><span class="nb-shiki-mdbnqw"> treatment=new-checkout</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --default</span><span class="nb-shiki-mdbnqw"> control</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --type</span><span class="nb-shiki-mdbnqw"> string</span></span></code></pre></figure> <p>After a flag exists, change its default variation or use enable and disable commands as kill switches. Existing targeting rules continue to apply unless you change or clear them explicitly:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> update</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span><span class="nb-shiki-dzsirb"> --default</span><span class="nb-shiki-mdbnqw"> treatment</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> disable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span></span></code></pre></figure> <p>For release workflows, use <code>rollout</code>, <code>split</code>, and <code>rules</code> to change exposure without redeploying your Worker:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> rollout</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> new-checkout</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --to</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --percentage</span><span class="nb-shiki-dzsirb"> 25</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --by</span><span class="nb-shiki-mdbnqw"> user_id</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> split</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --weight</span><span class="nb-shiki-mdbnqw"> control=</span><span class="nb-shiki-dzsirb">80</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --weight</span><span class="nb-shiki-mdbnqw"> treatment=</span><span class="nb-shiki-dzsirb">20</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --by</span><span class="nb-shiki-mdbnqw"> user_id</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> flagship</span><span class="nb-shiki-mdbnqw"> flags</span><span class="nb-shiki-mdbnqw"> rules</span><span class="nb-shiki-mdbnqw"> update</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APP_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw"> checkout-flow</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --priority</span><span class="nb-shiki-dzsirb"> 1</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --when</span><span class="nb-shiki-mdbnqw"> "country equals US"</span></span></code></pre></figure> <p>These commands can also be used from CI/CD pipelines, scripts, and AI agents to inspect Flagship state, update flag behavior, or roll back changes through Wrangler.</p> <p>Refer to the <a href="https://developers.cloudflare.com/flagship/reference/wrangler-commands/"><code>wrangler flagship</code> command reference</a> for the full command guide.</p>Thu, 16 Jul 2026 00:00:00 GMTFlagshipFlagshipRules - Bot management fields and ASN support in Cache Ruleshttps://developers.cloudflare.com/changelog/post/2026-07-16-cache-rules-bot-fields-asn/https://developers.cloudflare.com/changelog/post/2026-07-16-cache-rules-bot-fields-asn/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bot-management-fields-and-asn-support-in-cache-rules">Bot management fields and ASN support in Cache Rules</h4><a class="anchor-link" href="#bot-management-fields-and-asn-support-in-cache-rules"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cache Rules now supports bot management fields and the <code>ip.src.asnum</code> field in expression filters. You can now build cache policies that differentiate between automated and human traffic, or segment caching behavior by autonomous system number (ASN).</p> <p>This allows you to apply different caching strategies for verified bots, high-risk traffic, or specific network operators without affecting legitimate user requests. For example, you can set shorter cache TTLs for suspected bot traffic or bypass cache entirely for requests from specific ASNs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields">New fields</h4><a class="anchor-link" href="#new-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following fields are now available in Cache Rules expressions:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>cf.bot_management.score</code></td> <td>Number</td> <td>Bot score from <code>1</code> to <code>99</code>, where a lower value indicates a higher likelihood that the request originates from a bot.</td> </tr> <tr> <td><code>cf.bot_management.ja3_hash</code></td> <td>String</td> <td>JA3 fingerprint of the request, which helps identify the client making the connection.</td> </tr> <tr> <td><code>cf.bot_management.ja4</code></td> <td>String</td> <td>JA4 fingerprint of the request, which provides a more detailed client identification than JA3.</td> </tr> <tr> <td><code>cf.bot_management.verified_bot</code></td> <td>Boolean</td> <td>Whether the request originates from a verified bot, such as a search engine crawler.</td> </tr> <tr> <td><code>cf.bot_management.static_resource</code></td> <td>Boolean</td> <td>Whether the request is for a static resource and therefore exempt from bot detection.</td> </tr> <tr> <td><code>cf.bot_management.js_detection.passed</code></td> <td>Boolean</td> <td>Whether the browser passed JavaScript detection when the feature is enabled.</td> </tr> <tr> <td><code>cf.bot_management.attack_score</code></td> <td>Number</td> <td>Classifies the request by attack score, from <code>1</code> (likely automated) to <code>99</code> (likely human).</td> </tr> <tr> <td><code>cf.bot_management.api_score</code></td> <td>Number</td> <td>Classifies the request by API score, from <code>1</code> (likely automated) to <code>99</code> (likely human).</td> </tr> <tr> <td><code>cf.bot_management.bot_tags["&lt;TAG&gt;"]</code></td> <td>Boolean</td> <td>Whether the bot traffic matches the specified tag, such as <code>google</code> or <code>bing</code>.</td> </tr> <tr> <td><code>cf.bot_management.corporate_proxy</code></td> <td>Boolean</td> <td>Whether the request originates from a known corporate proxy.</td> </tr> <tr> <td><code>ip.src.asnum</code></td> <td>Number</td> <td>The autonomous system number (ASN) of the incoming request's IP address.</td> </tr> </tbody> </table></div> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Bot management fields require a Bot Management subscription. <code>ip.src.asnum</code> is available on all plans.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example">Example</h4><a class="anchor-link" href="#example"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cache Rules expressions support combining these fields with other criteria. The following example sets a shorter cache TTL for API requests that originate from a high-risk bot or an unexpected ASN:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">(http.request.uri.path contains "/api/" and cf.bot_management.score lt 30)</span></span> <span class="line"><span class="nb-shiki-wvjl67">or</span></span> <span class="line"><span class="nb-shiki-wvjl67">(http.request.uri.path contains "/api/" and not ip.src.asnum in {12345 67890})</span></span></code></pre></figure> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/cache/how-to/cache-rules/">Cache Rules documentation</a> and the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/">Fields reference</a>.</p>Thu, 16 Jul 2026 00:00:00 GMTRulesRulesGateway, DNS - Internal DNS is now generally availablehttps://developers.cloudflare.com/changelog/post/2026-07-15-internal-dns-ga/https://developers.cloudflare.com/changelog/post/2026-07-15-internal-dns-ga/<p><a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS</a> is now generally available. Internal DNS provides authoritative and recursive DNS for private networks on the same global network and control plane you already use for public DNS, Zero Trust, and application services.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-it-matters">Why it matters</h4><a class="anchor-link" href="#why-it-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Consolidate DNS operations.</strong> Public and private DNS run on one platform, with one API, one audit trail, and one place to set policy.</li> <li><strong>Simplify split-horizon DNS.</strong> Internal and external resolution are defined as separate <a href="https://developers.cloudflare.com/dns/internal-dns/dns-views/">views</a> over shared zones, managed from a single control plane — so there is no drift to chase down.</li> <li><strong>Extend Zero Trust to DNS.</strong> Resolver policies decide which users and devices resolve against which view, enforced by the same <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway</a> that already governs the rest of your traffic.</li> </ul> <p>Setting up Internal DNS takes three steps: create a zone, create a view, and define a resolver policy.</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">POST /zones</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "account"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;ACCOUNT_ID&gt;"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"corp.internal"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"internal"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Internal DNS is included with <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a> for Enterprise customers. To get started, refer to the <a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS documentation</a>.</p>Wed, 15 Jul 2026 00:00:00 GMTGatewayGatewayDNSEmail Service, Queues - Subscribe to Email Sending events with Queueshttps://developers.cloudflare.com/changelog/post/2026-07-15-event-subscriptions/https://developers.cloudflare.com/changelog/post/2026-07-15-event-subscriptions/<p>You can now subscribe to <strong><a href="https://developers.cloudflare.com/email-service/api/send-emails/">Email Sending</a> events</strong> through <a href="https://developers.cloudflare.com/queues/event-subscriptions/">Queues event subscriptions</a> and receive outbound transactional email lifecycle events on a queue. Each subscription is scoped to one sending domain — either the zone apex, such as <code>example.com</code>, or a verified sending subdomain, such as <code>send.example.com</code>.</p> <p>Six event types are published: <code>message.delivered</code>, <code>message.deferred</code>, <code>message.bounced</code>, <code>message.failed</code>, <code>message.rejected</code>, and <code>message.complained</code>. Use them to track deliverability, react to bounces and complaints, and drive suppression or retry logic. Email Routing events are not published on this source.</p> <p>Each event includes the message details, delivery status, and SMTP response:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf.email.sending.message.delivered"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "source"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"email.sending"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "zoneId"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"023e105f4ecef8ad9ca31a8372d0c353"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "domain"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"example.com"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "payload"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "messageId"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"0101018f7d0c4d9a-msg-deadbeef"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "recipient"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"user@example.net"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "terminal"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "delivery"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "status"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"delivered"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "smtpStatusCode"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"250"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/email-service/platform/event-subscriptions/">Event subscriptions</a> to see all event types and example payloads.</p>Wed, 15 Jul 2026 00:00:00 GMTEmail ServiceEmail ServiceQueuesKV - Deprecate legacy Workers KV namespace API routeshttps://developers.cloudflare.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/https://developers.cloudflare.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/<p>The legacy Workers KV API routes under <code>/accounts/{account_id}/workers/namespaces/*</code> are deprecated as of July 15, 2026, and will stop working on October 15, 2026. Migrate to the documented <a href="https://developers.cloudflare.com/api/resources/kv/">Workers KV API</a> routes under <code>/accounts/{account_id}/storage/kv/namespaces/*</code> before that date.</p> <p>The legacy and replacement routes are interchangeable. They accept the same request parameters and return the same response payloads. To migrate, update the URL path from <code>/workers/namespaces/</code> to <code>/storage/kv/namespaces/</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-need-to-do">What you need to do</h4><a class="anchor-link" href="#what-you-need-to-do"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Update any integration that calls a route under <code>/accounts/{account_id}/workers/namespaces/</code> to use the equivalent route under <code>/accounts/{account_id}/storage/kv/namespaces/</code>. The migration is a direct URL path substitution — request parameters and response payloads are identical:</p> <ul> <li><code>GET</code> and <code>POST /accounts/{account_id}/workers/namespaces</code> → <code>GET</code> and <code>POST /accounts/{account_id}/storage/kv/namespaces</code></li> <li><code>GET</code>, <code>PUT</code>, and <code>DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}</code> → <code>GET</code>, <code>PUT</code>, and <code>DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}</code></li> <li><code>GET /accounts/{account_id}/workers/namespaces/{namespace_id}/keys</code> → <code>GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/keys</code></li> <li><code>GET /accounts/{account_id}/workers/namespaces/{namespace_id}/metadata/{key_name}</code> → <code>GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/metadata/{key_name}</code></li> <li><code>GET</code>, <code>PUT</code>, and <code>DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}/values/{key_name}</code> → <code>GET</code>, <code>PUT</code>, and <code>DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/values/{key_name}</code></li> </ul> <p>For more information about the deprecation timeline, refer to <a href="https://developers.cloudflare.com/fundamentals/api/reference/deprecations/">API deprecations</a>.</p>Wed, 15 Jul 2026 00:00:00 GMTKVKVWAF - WAF Release - 2026-07-14https://developers.cloudflare.com/changelog/post/2026-07-14-waf-release/https://developers.cloudflare.com/changelog/post/2026-07-14-waf-release/ <p>This release introduces new rules targeting critical infrastructure vulnerabilities. These include an unauthenticated memory disclosure flaw in Citrix NetScaler ADC and Gateway (CVE-2026-8451) and a high-severity pre-authentication remote code execution (RCE) vulnerability in Progress Kemp LoadMaster (CVE-2026-8037).</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>CVE-2026-8451: An insufficient input validation vulnerability affects Citrix NetScaler ADC and NetScaler Gateway appliances configured as a SAML Identity Provider (IdP). Remote, unauthenticated attackers can exploit this flaw by sending malformed requests to trigger a memory overread, allowing them to leak chunks of sensitive data from adjacent appliance memory.</p> </li> <li> <p>CVE-2026-8037: A critical OS command injection vulnerability in Progress Kemp LoadMaster load balancers allows unauthenticated remote attackers to achieve remote code execution (RCE).</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="78826e3223b94da493a2ade876973ac4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...76973ac4</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Citrix Netscaler ADC - Insufficient Input Validation - CVE:CVE-2026-8451</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6b64d216620449fbb273d07910233f36"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...10233f36</span></button></rule-id></td><td>N/A</td><td>Progress Kemp LoadMaster - Remote Code Execution - CVE:CVE-2026-8037</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr></tbody></table>Tue, 14 Jul 2026 00:00:00 GMTWAFWAFCloudflare Web Analytics - Improved reliability for account-wide Web Analytics dashboardshttps://developers.cloudflare.com/changelog/post/2026-06-10-improved-reliability-for-web-analytics-dash/https://developers.cloudflare.com/changelog/post/2026-06-10-improved-reliability-for-web-analytics-dash/<p>Cloudflare Web Analytics (Real User Monitoring) has rolled out performance optimizations to significantly improve the stability and loading speed of account-wide dashboards.</p> <p>For larger accounts (with &gt;100 Web Analytics sites), loading the aggregate account-wide view would often fail, running into timeouts or unexpected interface errors due to the massive scale of parallel query processing. This update optimizes how high-volume multi-site data is queried to reduce errors and provide a snappier dashboard experience.</p> <p>Accounts with up to 1,000 sites will now be able to load this account-wide aggregate view without experiencing misleading errors.</p> <p>If you have an account with over 1,000 sites, we cannot currently aggregate over this volume due to processing constraints but you will now be presented with a clear error and instruction to filter to the relevant site(s) you wish to see the data for.</p>Tue, 14 Jul 2026 00:00:00 GMTCloudflare Web AnalyticsCloudflare Web AnalyticsWorkers - Platforms can now create Temporary Accounts via the Cloudflare APIhttps://developers.cloudflare.com/changelog/post/2026-07-14-temporary-accounts-api/https://developers.cloudflare.com/changelog/post/2026-07-14-temporary-accounts-api/<p>Platforms can now create temporary preview accounts through the Cloudflare REST API. This lets your platform deploy a live Worker before the user signs in to Cloudflare.</p> <p>With the Temporary Accounts API, coding agents, AI app builders, and other platforms can build a similar flow for generated Workers and supported resources.</p> <p>Your platform can keep users in its onboarding flow while they generate, deploy, and test an application. Users do not need an existing Cloudflare account, and your platform does not need write access to one.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1748,height=368,format=webp/_astro/claim-deployments-flow.Co0tUHG4.png" alt="Diagram showing an AI agent deploying, verifying, and redeploying a Worker in a temporary account, then a user authenticating and claiming the account to keep its resources" loading="lazy" decoding="async" width="1748" height="368"> <p>The API returns a claim URL that lets the user make the temporary account and its resources permanent.</p> <p><a href="https://www.cloudflare.com/drop/" target="_blank" rel="noopener">Cloudflare Drop<span class="external-link"> ↗</span></a> demonstrates this preview-and-claim pattern for static sites. Someone can upload a site, test and share it for one hour, then sign in or create an account only when they want to keep it.</p> <p>This API expands the flow first introduced with <a href="https://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/"><code>wrangler deploy --temporary</code></a>. Your backend now controls the provisioning and deployment experience directly:</p> <ol> <li>Show Cloudflare's Terms of Service and Privacy Policy in your product, and require the user to accept them.</li> <li>Request and solve a proof-of-work challenge.</li> <li>Create a temporary preview account.</li> <li>Deploy with the returned temporary account ID and API token.</li> <li>Show the deployed Worker URL and claim URL to the user.</li> </ol> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/provisioning/previews/challenge"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{}'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/provisioning/previews"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "termsOfService": "https://www.cloudflare.com/terms/",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "privacyPolicy": "https://www.cloudflare.com/privacypolicy/",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "acceptTermsOfService": "yes",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "challengeToken": "&lt;CHALLENGE_TOKEN&gt;",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "solution": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "checkpoints": "&lt;BASE64_CHECKPOINTS&gt;"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>For the complete API flow, proof-of-work requirements, supported products, and limits, refer to <a href="https://developers.cloudflare.com/workers/platform/claim-deployments/#integrate-with-the-rest-api">Claim deployments (temporary accounts)</a>. For the background and design goals behind this flow, refer to <a href="https://blog.cloudflare.com/temporary-accounts/" target="_blank" rel="noopener">Temporary Cloudflare Accounts for AI agents<span class="external-link"> ↗</span></a>.</p>Tue, 14 Jul 2026 00:00:00 GMTWorkersWorkersAgents, Workers - Agents can respond to MCP elicitation requestshttps://developers.cloudflare.com/changelog/post/2026-07-13-mcp-client-elicitation/https://developers.cloudflare.com/changelog/post/2026-07-13-mcp-client-elicitation/ <p>Agents connected to Model Context Protocol (MCP) servers with <a href="https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/"><code>addMcpServer</code></a> can now handle <a href="https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation" target="_blank" rel="noopener">elicitation<span class="external-link"> ↗</span></a> requests.</p> <p>Elicitation lets an MCP server request user input while it handles a tool call. Form mode collects structured, non-sensitive data. URL mode asks for consent before opening an out-of-band flow, such as third-party authorization or payment.</p> <pre class="mermaid">sequenceDiagram participant User participant Agent as Agent (MCP client) participant Server as MCP server participant Browser Server-&gt;&gt;Agent: elicitation/create Agent-&gt;&gt;User: Show server, reason, and input or URL User-&gt;&gt;Agent: Submit, open, decline, or cancel Agent-&gt;&gt;Browser: Open URL after consent (URL mode) Agent-&gt;&gt;Server: accept, decline, or cancel Server--&gt;&gt;Agent: Optional URL completion notification </pre> <p>Register a handler for each mode your Agent supports in <code>onStart()</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.mcp.</span><span class="nb-shiki-1t8gfj">configureElicitationHandlers</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> form</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">serverId</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">forwardToUser</span><span class="nb-shiki-140thh">(request, serverId),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> url</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">serverId</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">forwardToUser</span><span class="nb-shiki-140thh">(request, serverId),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> forwardToUser</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">serverId</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Show the request in your UI and resolve after the user responds.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> throw</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Error</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `Implement elicitation for ${</span><span class="nb-shiki-140thh">serverId</span><span class="nb-shiki-mdbnqw">}: ${</span><span class="nb-shiki-140thh">request</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">params</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { ElicitRequest, ElicitResult } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/mcp"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.mcp.</span><span class="nb-shiki-1t8gfj">configureElicitationHandlers</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> form</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">serverId</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">forwardToUser</span><span class="nb-shiki-140thh">(request, serverId),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> url</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">serverId</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">forwardToUser</span><span class="nb-shiki-140thh">(request, serverId),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> private</span><span class="nb-shiki-1t8gfj"> forwardToUser</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ElicitRequest</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> serverId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> )</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">ElicitResult</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Show the request in your UI and resolve after the user responds.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> throw</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Error</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `Implement elicitation for ${</span><span class="nb-shiki-140thh">serverId</span><span class="nb-shiki-mdbnqw">}: ${</span><span class="nb-shiki-140thh">request</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">params</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Connections advertise only the modes with configured handlers. An Agent without handlers advertises no elicitation capability, which lets the server use its fallback. The SDK stores the advertised modes with each MCP server registration so they survive Durable Object hibernation. Callback functions remain in memory and reattach when <code>onStart()</code> runs.</p> <p>For implementation details and a browser forwarding pattern, refer to <a href="https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/#elicitation">MCP client elicitation</a>. The <a href="https://github.com/cloudflare/agents/tree/main/examples/mcp-client" target="_blank" rel="noopener"><code>mcp-client</code><span class="external-link"> ↗</span></a> and <a href="https://github.com/cloudflare/agents/tree/main/examples/mcp-elicitation" target="_blank" rel="noopener"><code>mcp-elicitation</code><span class="external-link"> ↗</span></a> examples implement both sides.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to this release:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-npm" id="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-yarn" id="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-pnpm" id="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-bun" id="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-npm" aria-labelledby="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-yarn" aria-labelledby="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-pnpm" aria-labelledby="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-e420f4b1-1943-4827-9929-9fb12d41397a-bun" aria-labelledby="pm-tab-pm-e420f4b1-1943-4827-9929-9fb12d41397a-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script>Mon, 13 Jul 2026 00:00:00 GMTAgentsAgentsWorkersChallenges - Precursor introduces session-based bot detectionhttps://developers.cloudflare.com/changelog/post/2026-07-13-precursor-session-based-detection/https://developers.cloudflare.com/changelog/post/2026-07-13-precursor-session-based-detection/<p>Precursor is rolling out to all customers starting today. Precursor is client-side JavaScript that enables session-based bot detection.</p> <p>You can <a href="https://blog.cloudflare.com/introducing-precursor" target="_blank" rel="noopener">read the announcement blog<span class="external-link"> ↗</span></a> for background on why we built Precursor and how session-level behavioral detection works.</p> <p>With Precursor enabled, Cloudflare can:</p> <ul> <li>Continuously evaluate behavioral signals across a session</li> <li>Re-validate challenge clearance as behavior changes</li> <li>Update bot scores with session context</li> <li>Provide client-side visibility where none previously existed</li> </ul> <p>It integrates with existing protections, including Security Rules, and can be enabled directly from the Cloudflare dashboard with configurable modes to balance security and user experience.</p> <img src="https://developers.cloudflare.com/images/precursor/enabling_precursor.gif" alt="Animated walkthrough of enabling Precursor in the Cloudflare dashboard" style="border:1px solid #e5e7eb;border-radius:6px;display:block;margin:16px 0;"/> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/cloudflare-challenges/precursor/">Precursor documentation</a>.</p>Mon, 13 Jul 2026 00:00:00 GMTChallengesChallengesCloudflare Fundamentals - Origin Content Signals for Markdown for Agentshttps://developers.cloudflare.com/changelog/post/2026-07-13-markdown-for-agents-header-preservation/https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-for-agents-header-preservation/<p><a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">Markdown for Agents</a> now preserves security- and cache-relevant response headers from your origin when converting HTML to Markdown:</p> <ul> <li>Markdown for Agents preserves security headers such as <code>Strict-Transport-Security</code> (HSTS), <code>Content-Security-Policy</code> (CSP), <code>X-Frame-Options</code>, <code>Set-Cookie</code>, and CORS headers (for example, <code>Access-Control-Allow-Origin</code>) on the converted response.</li> <li>Caching headers (<code>Cache-Control</code>, <code>Expires</code>, <code>Age</code>) continue to pass through.</li> </ul> <p>Your origin's <a href="https://contentsignals.org/" target="_blank" rel="noopener">Content Signals<span class="external-link"> ↗</span></a> policy is now authoritative. If your origin sets a <code>content-signal</code> header, Markdown for Agents preserves it. When the origin does not send one, Cloudflare adds the default <code>Content-Signal: ai-train=yes, search=yes, ai-input=yes</code>.</p> <p>This release also fixes relative link resolution for directory-style base URLs (those ending in a trailing slash). Previously, relative links such as <code>../page/</code> could resolve one path segment too high and return a <code>404</code>. Links are now resolved correctly per <a href="https://www.rfc-editor.org/rfc/rfc3986#section-5.2.3" target="_blank" rel="noopener">RFC 3986<span class="external-link"> ↗</span></a>.</p> <p>Refer to our <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">developer documentation</a> for more details.</p>Mon, 13 Jul 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsR2, R2 Data Catalog - R2 Data Catalog now supports read-only API tokenshttps://developers.cloudflare.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/https://developers.cloudflare.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> now accepts read-only API tokens, so query engines and clients that only read data no longer need a read-write token. Previously, every catalog operation required an <strong>Admin Read &amp; Write</strong> token, which granted read-only clients more access than they needed.</p> <p>You can now authenticate your Iceberg engine based on your workload:</p> <ul> <li><strong>Read-only</strong> operations (such as listing namespaces, loading tables, and querying data) work with an <strong>Admin Read only</strong> token (R2 Data Catalog read and R2 storage read).</li> <li><strong>Write</strong> operations (such as creating or dropping tables and committing transactions) continue to require an <strong>Admin Read &amp; Write</strong> token.</li> </ul> <p>This lets you follow the principle of least privilege — for example, using a read-write token for the pipeline that writes to your tables and read-only tokens for engines like <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a>, <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/">DuckDB</a>, or <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/pyiceberg/">PyIceberg</a> that query them.</p> <p>Note that credentials vended by the catalog inherit the R2 storage permissions of the token used to authenticate. To ensure read-only access to your underlying data, scope the R2 storage permission to read-only as well.</p> <p>For details on choosing and creating the right token, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/#authenticate-your-iceberg-engine">Authenticate your Iceberg engine</a>.</p>Mon, 13 Jul 2026 00:00:00 GMTR2R2R2 Data CatalogR2 Data Catalog - R2 Data Catalog compaction now optimizes manifest fileshttps://developers.cloudflare.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/https://developers.cloudflare.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>, a managed <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> catalog built into R2, now automatically optimizes manifest files as part of <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">compaction</a>.</p> <p>Manifest files track the data files that make up an Iceberg table. As a table accumulates many small or fragmented manifests, query engines must read more metadata during query planning, which slows down queries even before any data is scanned.</p> <p>When compaction runs, R2 Data Catalog now rewrites and clusters manifest files by partition as a best-effort pre-step. This consolidates fragmented manifests, reduces the number of manifests a query engine must open, and lowers metadata I/O overhead. Tables that are already well-clustered are skipped, so the operation only runs when it provides a benefit.</p> <p>This happens automatically for tables with compaction enabled — no configuration changes are required.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">Table maintenance</a>.</p>Mon, 13 Jul 2026 00:00:00 GMTR2 Data CatalogR2 Data CatalogData Loss Prevention - Source code detection improvementshttps://developers.cloudflare.com/changelog/post/2026-07-10-source-code-detection-improvements/https://developers.cloudflare.com/changelog/post/2026-07-10-source-code-detection-improvements/<p>Data Loss Prevention (DLP) source code detection now focuses on identifying whole source code file uploads and downloads. Previously, source code detection performed partial scans resulting in a higher rate of false positives. Since only whole source code files are evaluated, code embedded in other content — such as chat messages, documentation, or code samples — is no longer flagged as source code, removing a common source of false positives.</p> <p>Source code detection requires a minimum of 500 characters to evaluate a file. Files below this threshold are not flagged to reduce noise. This threshold filters out small fragments that lack enough context for reliable classification.</p> <p>Enable and set <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/advanced-settings/#confidence-thresholds">confidence levels</a> to tune match sensitivity. A higher confidence level reduces false positives by requiring stronger signals that the content is truly source code. A lower confidence level catches more files at the cost of additional noise.</p> <p>Source code detection applies to standalone source code files in <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">Gateway HTTP policies</a>. It does not detect source code embedded within other file types or payloads, such as <code>.docx</code> files or chat messages.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#source-code">Source Code predefined profiles</a>.</p>Fri, 10 Jul 2026 00:00:00 GMTData Loss PreventionData Loss PreventionWorkers AI - Plain text output for Markdown Conversionhttps://developers.cloudflare.com/changelog/post/2026-07-13-markdown-conversion-text-output/https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-conversion-text-output/ <p>The <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown Conversion</a> service now supports a new <code>output</code> conversion option that controls the format of the converted content.</p> <p>Set <code>output.format</code> to <code>text</code> to receive plain text with Markdown syntax removed. The default value is <code>markdown</code>, so existing conversions are unchanged.</p> <p>Use the <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/usage/binding/"><code>env.AI</code></a> binding:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { name: </span><span class="nb-shiki-mdbnqw">"page.html"</span><span class="nb-shiki-140thh">, blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([html]) },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> conversionOptions: {</span></span> <span class="line"><span class="nb-shiki-140thh"> output: { format: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { name: </span><span class="nb-shiki-mdbnqw">"page.html"</span><span class="nb-shiki-140thh">, blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([html]) },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> conversionOptions: {</span></span> <span class="line"><span class="nb-shiki-140thh"> output: { format: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Or call the REST API:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {API_TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'files=@index.html'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'conversionOptions={"output": {"format": "text"}}'</span></span></code></pre></figure> <p>When you request text output, the <code>format</code> field of each result is set to <code>text</code>. For more details, refer to <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/conversion-options/#output">Conversion Options</a>.</p>Fri, 10 Jul 2026 00:00:00 GMTWorkers AIWorkers AIWorkflows - Workflows now supports delay functions when retryinghttps://developers.cloudflare.com/changelog/post/2026-07-09-dynamic-retry-delays/https://developers.cloudflare.com/changelog/post/2026-07-09-dynamic-retry-delays/ <p>With <a href="https://developers.cloudflare.com/workflows/">Workflows</a>, you can configure built-in retry behavior for each step. Previously, you could configure step retries with fixed delay durations, such as seconds, minutes, or hours, and backoff strategies such as <code>constant</code>, <code>linear</code>, or <code>exponential</code>.</p> <p>Step retries now support dynamic delay functions. Instead of choosing only a base delay and backoff strategy, pass a function to <code>retries.delay</code> and calculate the next delay from the failed attempt and thrown error.</p> <p>This is useful when retries should depend on the failure. Your Workflow may need to wait longer after a rate-limit error, but retry sooner after a short network failure. The delay function can also accommodate provider guidance if, for example, a downstream API returns a <code>Retry-After</code> value in its error messaging.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "sync customer"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: {</span></span> <span class="line"><span class="nb-shiki-140thh"> limit: </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> delay</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (error.message.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"rate limit"</span><span class="nb-shiki-140thh">)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> `${</span><span class="nb-shiki-140thh">ctx</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">attempt</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 30</span><span class="nb-shiki-mdbnqw">} seconds`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> "10 seconds"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> syncCustomer</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "sync customer"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: {</span></span> <span class="line"><span class="nb-shiki-140thh"> limit: </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> delay</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (error.message.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"rate limit"</span><span class="nb-shiki-140thh">)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> `${</span><span class="nb-shiki-140thh">ctx</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">attempt</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 30</span><span class="nb-shiki-mdbnqw">} seconds`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> "10 seconds"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> syncCustomer</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Dynamic delay functions can return a duration string, a number, or a promise that resolves to a duration. Use them to add adaptive retry behavior without writing separate queue or scheduling logic. For more information, refer to <a href="https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/">Sleeping and retrying</a>.</p>Thu, 09 Jul 2026 12:00:00 GMTWorkflowsWorkflowsDigital Experience Monitoring - Wi-Fi signal and network performance analytics for Cloudflare One Client deviceshttps://developers.cloudflare.com/changelog/post/2026-07-09-warp-wifi-network-performance-analytics/https://developers.cloudflare.com/changelog/post/2026-07-09-warp-wifi-network-performance-analytics/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience Monitoring (DEX)</a> provides visibility into device, network, and application performance across your Cloudflare SASE deployment.</p> <p>The <strong>Device Monitoring</strong> page now analyzes hardware and network data between a Cloudflare One Client device and Cloudflare's edge, so you can diagnose connectivity and performance issues. Previously, this data was only available in raw DEX Device State Event logs, which required you to build your own analytics to interpret it.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1652,height=664,format=webp/_astro/dex-device-monitoring-summary.CBxeSd6b.png" alt="Device Monitoring summary with connection status, connection mode, Wi-Fi signal strength, traffic performance, and device health" loading="lazy" decoding="async" width="1652" height="664"> <p>A summary at the top of the page shows the health of each category at a glance, using <strong>Good</strong>, <strong>Fair</strong>, and <strong>Poor</strong> labels:</p> <ul> <li><strong>Connection</strong> — connection status, Cloudflare One Client mode, and tunnel type over time</li> <li><strong>Wi-Fi signal strength</strong> — signal measured in dBm over time, with thresholds that flag a weak signal</li> <li><strong>Traffic performance</strong> — upstream and downstream performance, including network throughput on the active interface</li> <li><strong>Device health</strong> — hardware metrics such as CPU, memory, and disk</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1666,height=732,format=webp/_astro/dex-device-monitoring-wifi-network.CoEBznAm.png" alt="Wi-Fi signal strength and network throughput charts on the Device Monitoring page" loading="lazy" decoding="async" width="1666" height="732"> <p>You can filter by category and adjust the time range to correlate a device's metrics with a user's reported issue.</p> <p>These analytics are available to all Cloudflare One customers at no additional cost.</p> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/monitoring/">DEX monitoring documentation</a>.</p>Thu, 09 Jul 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringDNS - New DNS Firewall UX with more dashboard settingshttps://developers.cloudflare.com/changelog/post/2026-07-09-new-dns-firewall-ux/https://developers.cloudflare.com/changelog/post/2026-07-09-new-dns-firewall-ux/ <p>The DNS Firewall page in the Cloudflare dashboard has been refreshed, bringing several settings that were previously API-only into the UI and modernizing how you view and manage your DNS Firewall clusters.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2694,height=1247,format=webp/_astro/dnsfw-new-ux.vHgdhBZD.png" alt="New DNS Firewall UX" loading="lazy" decoding="async" width="2694" height="1247"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-new">What is new</h4><a class="anchor-link" href="#what-is-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>More settings in the dashboard</strong>: cluster options that were previously only configurable through the API — such as attack mitigation, rate limiting, negative TTL, and resolver subnet — are now available directly in the dashboard.</li> <li><strong>Better table experience</strong>: the DNS Firewall cluster table has been revised to surface cluster details at a glance, with resizable columns and the option to show or hide columns to tailor the view to your workflow.</li> <li><strong>New create and edit UX</strong>: adding and editing clusters now uses a modernized form that groups related settings together, making configuration faster and clearer.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available to all DNS Firewall customers as part of their existing subscription.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="where-to-find-it">Where to find it</h4><a class="anchor-link" href="#where-to-find-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In the Cloudflare dashboard, go to the <strong>DNS Firewall</strong> page.</p> <a href="https://dash.cloudflare.com/?to=/:account/dns-firewall/clusters" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Clusters</strong>&nbsp;&#8599;</a> <p>For more information, refer to <a href="https://developers.cloudflare.com/dns/dns-firewall/">DNS Firewall</a>.</p>Thu, 09 Jul 2026 00:00:00 GMTDNSDNSDurable Objects, Workers - New Durable Object namespaces must use the SQLite storage backendhttps://developers.cloudflare.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/https://developers.cloudflare.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/ <p>If your account does not already have a key-value (KV) backed Durable Object namespace, you can no longer create new ones. New Durable Object namespaces must use the <a href="https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class">SQLite storage backend</a>, which has been recommended for all new Durable Objects since it became <a href="https://blog.cloudflare.com/sqlite-in-durable-objects/" target="_blank" rel="noopener">generally available<span class="external-link"> ↗</span></a> in 2024.</p> <p>Create a new class with a <code>new_sqlite_classes</code> migration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"v1"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "new_sqlite_classes"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "MyDurableObject"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">migrations</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">tag = </span><span class="nb-shiki-mdbnqw">"v1"</span></span> <span class="line"><span class="nb-shiki-140thh">new_sqlite_classes = [</span><span class="nb-shiki-mdbnqw">"MyDurableObject"</span><span class="nb-shiki-140thh">]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>SQLite-backed Durable Objects have feature parity with the key-value backend — including the <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#synchronous-kv-api">key-value storage API</a> — and additionally support relational <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#sql-api">SQL queries</a> and <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#pitr-point-in-time-recovery-api">point-in-time recovery</a> to restore an object's storage to any point in the past 30 days.</p> <p>If you attempt to create a new key-value backed namespace (a <code>new_classes</code> migration) on an affected account, the deployment fails with the following error:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">Creating new key-value backed Durable Object namespaces is no longer supported on this account. Please create a namespace using a `new_sqlite_classes` migration instead.</span></span></code></pre></figure> <p>This change only affects accounts that are not already using the key-value storage backend. Accounts with at least one existing key-value backed namespace can still create new ones for now, and the Workers Free plan has only ever supported SQLite-backed Durable Objects. It is part of a broader move toward SQLite as the single storage backend for Durable Objects, ahead of a future migration path for existing key-value backed objects.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/">Durable Objects migrations</a>.</p>Thu, 09 Jul 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersCloudflare Tunnel, Cloudflare Tunnel for SASE, Cloudflare Mesh - Zero Trust Networks route endpoints and Cloudflare Tunnel connections field retiring on October 5, 2026https://developers.cloudflare.com/changelog/post/2026-07-09-tunnel-routes-and-connections-api-changes/https://developers.cloudflare.com/changelog/post/2026-07-09-tunnel-routes-and-connections-api-changes/<p>On <strong>October 5, 2026</strong>, two changes take effect across the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/">Zero Trust Networks API</a> and <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/">Cloudflare Tunnel API</a>: the CIDR-encoded route endpoints are removed, and tunnel list and get responses no longer include the <code>connections</code> field. If you manage private network routes or read tunnel connection details through the API, <code>cloudflared</code>, Terraform, or another integration, review the changes in the following sections and migrate before the removal date.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="route-endpoints">Route endpoints</h4><a class="anchor-link" href="#route-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The CIDR-encoded route endpoints are deprecated in favor of the standard, <code>route_id</code>-based endpoints that already exist today. Both sets of endpoints route a private network through <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> or <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> (the API still refers to Mesh nodes as <code>warp_connector</code>) — only the request shape changes.</p> <p><strong>Deprecated endpoints (removed October 5, 2026):</strong></p> <ul> <li>Create a tunnel route (CIDR Endpoint): <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/create/"><code>POST /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}</code></a></li> <li>Update a tunnel route (CIDR Endpoint): <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/edit/"><code>PATCH /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}</code></a></li> <li>Delete a tunnel route (CIDR Endpoint): <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/delete/"><code>DELETE /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}</code></a></li> </ul> <p><strong>Replacement endpoints:</strong></p> <ul> <li>Create a tunnel route: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/create/"><code>POST /accounts/{account_id}/teamnet/routes</code></a></li> <li>Update a tunnel route: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/edit/"><code>PATCH /accounts/{account_id}/teamnet/routes/{route_id}</code></a></li> <li>Delete a tunnel route: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/delete/"><code>DELETE /accounts/{account_id}/teamnet/routes/{route_id}</code></a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-changing">What is changing</h4><a class="anchor-link" href="#what-is-changing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th style="text-align: left"></th> <th style="text-align: left">Deprecated (CIDR-encoded path)</th> <th style="text-align: left">Replacement</th> </tr> </thead> <tbody> <tr> <td style="text-align: left">Route identifier</td> <td style="text-align: left">URL-encoded CIDR in the path (<code>/network/{ip_network_encoded}</code>)</td> <td style="text-align: left"><code>route_id</code> in the path (<code>network</code> moves to the request body on create)</td> </tr> <tr> <td style="text-align: left">Create</td> <td style="text-align: left"><code>POST .../teamnet/routes/network/{ip_network_encoded}</code></td> <td style="text-align: left"><code>POST .../teamnet/routes</code> with <code>network</code> and <code>tunnel_id</code> in the body</td> </tr> <tr> <td style="text-align: left">Update</td> <td style="text-align: left"><code>PATCH .../teamnet/routes/network/{ip_network_encoded}</code></td> <td style="text-align: left"><code>PATCH .../teamnet/routes/{route_id}</code></td> </tr> <tr> <td style="text-align: left">Delete</td> <td style="text-align: left"><code>DELETE .../teamnet/routes/network/{ip_network_encoded}</code></td> <td style="text-align: left"><code>DELETE .../teamnet/routes/{route_id}</code></td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="action-required">Action required</h4><a class="anchor-link" href="#action-required"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Capture each route's <code>route_id</code> by calling <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/list/">List tunnel routes</a>, or read it from the response the first time you create a route with the replacement endpoint.</li> <li>Update any scripts, backend services, or CI/CD pipelines that call the CIDR-encoded endpoints directly.</li> <li>If you manage routes with the <code>cloudflared tunnel route ip add | delete</code> commands, upgrade <code>cloudflared</code> to the <a href="https://github.com/cloudflare/cloudflared/releases" target="_blank" rel="noopener">latest version<span class="external-link"> ↗</span></a>.</li> <li>If you manage routes with Terraform, make sure you are on a current version of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_tunnel_cloudflared_route" target="_blank" rel="noopener"><code>cloudflare_zero_trust_tunnel_cloudflared_route</code><span class="external-link"> ↗</span></a> resource and the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Cloudflare Terraform provider<span class="external-link"> ↗</span></a>.</li> </ol> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Before: create a route by URL-encoding the CIDR into the path</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/teamnet/routes/network/172.16.0.0%2F16</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{"tunnel_id": "'</span><span class="nb-shiki-140thh">$TUNNEL_ID</span><span class="nb-shiki-mdbnqw">'", "comment": "Example comment for this route."}'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># After: create a route with the network in the request body</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/teamnet/routes</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{"network": "172.16.0.0/16", "tunnel_id": "'</span><span class="nb-shiki-140thh">$TUNNEL_ID</span><span class="nb-shiki-mdbnqw">'", "comment": "Example comment for this route."}'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># After: update or delete a route using its route_id</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> PATCH</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/teamnet/routes/</span><span class="nb-shiki-140thh">$ROUTE_ID </span><span class="nb-shiki-dzsirb">\</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{"comment": "Updated comment for this route."}'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> DELETE</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/teamnet/routes/</span><span class="nb-shiki-140thh">$ROUTE_ID </span><span class="nb-shiki-dzsirb">\</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflare-tunnel-and-cloudflare-mesh-connections">Cloudflare Tunnel and Cloudflare Mesh connections</h4><a class="anchor-link" href="#cloudflare-tunnel-and-cloudflare-mesh-connections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Starting the same day, the <code>connections</code> array is removed from list and get responses for <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes (the <code>cfd_tunnel</code> and <code>warp_connector</code> API resources). Query the dedicated connections endpoint instead of reading the field off the tunnel or node object.</p> <p>This affects:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/methods/list/"><code>GET /accounts/{account_id}/cfd_tunnel</code></a> — <code>connections</code> removed from each item in <code>result</code></li> <li><a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/methods/get/"><code>GET /accounts/{account_id}/cfd_tunnel/{tunnel_id}</code></a> — <code>connections</code> removed from <code>result</code></li> <li><a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/methods/list/"><code>GET /accounts/{account_id}/warp_connector</code></a> — <code>connections</code> removed from each item in <code>result</code></li> <li><a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/methods/get/"><code>GET /accounts/{account_id}/warp_connector/{tunnel_id}</code></a> — <code>connections</code> removed from <code>result</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="action-required-1">Action required</h4><a class="anchor-link" href="#action-required-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Fetch connection details from the tunnel-specific connections endpoint instead of parsing it off the list or get response. For Cloudflare Tunnel, call <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/subresources/connections/methods/get/"><code>GET /accounts/{account_id}/cfd_tunnel/{tunnel_id}/connections</code></a>. For Cloudflare Mesh, call <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/subresources/connections/methods/get/"><code>GET /accounts/{account_id}/warp_connector/{tunnel_id}/connections</code></a>.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Before: read connections off the tunnel object</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/cfd_tunnel/</span><span class="nb-shiki-140thh">$TUNNEL_ID </span><span class="nb-shiki-dzsirb">\</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># After: query connections directly</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/cfd_tunnel/</span><span class="nb-shiki-140thh">$TUNNEL_ID</span><span class="nb-shiki-mdbnqw">/connections</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <p>Update any dashboards, monitoring scripts, or automation that parses <code>connections</code> from the tunnel list or get response. <code>cloudflared</code> and the Cloudflare Terraform provider do not read this field, so no changes are required on their side for this part of the update.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-we-are-making-these-changes">Why we are making these changes</h4><a class="anchor-link" href="#why-we-are-making-these-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Smaller, faster responses.</strong> Cloudflare Tunnel and Cloudflare Mesh nodes with many connections no longer inflate every list and get call — connection detail is only fetched when you need it.</li> <li><strong>A single way to identify a route.</strong> Consolidating on <code>route_id</code> removes the need to URL-encode CIDR ranges into the path and matches how every other resource in the Zero Trust Networks API is addressed.</li> <li><strong>Consistency across the API.</strong> Both changes align these endpoints with Cloudflare's standard REST conventions for resource identifiers and nested detail endpoints.</li> </ul> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/">Zero Trust Networks API</a>, the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/">Cloudflare Tunnel API</a>, and <a href="https://developers.cloudflare.com/cloudflare-one/networks/routes/">Routes</a> documentation.</p>Thu, 09 Jul 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASECloudflare MeshWorkers - Send npm package dependency metadata with Worker uploadshttps://developers.cloudflare.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/https://developers.cloudflare.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/ <p>Wrangler now collects npm package dependency information from your project's <code>package.json</code> during <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy"><code>wrangler deploy</code></a> and <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#upload"><code>wrangler versions upload</code></a>, and includes it in the upload metadata sent to the Cloudflare API. This data, each dependency's name, declared version range, and exact installed version, enables dependency analytics and future supply chain security features such as vulnerability alerting.</p> <p>To opt out, set <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#top-level-only-keys"><code>dependencies_instrumentation.enabled</code></a> to <code>false</code> in your Wrangler configuration file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "dependencies_instrumentation"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">dependencies_instrumentation</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">enabled = </span><span class="nb-shiki-dzsirb">false</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>For more details, refer to <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#top-level-only-keys">Wrangler configuration</a>.</p>Thu, 09 Jul 2026 00:00:00 GMTWorkersWorkersAI Search - Filter AI Search list items by exact object keyhttps://developers.cloudflare.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/https://developers.cloudflare.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/<p>In <a href="https://developers.cloudflare.com/ai-search/">AI Search</a>, you can upload files to an instance, or connect a <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/">data source</a> such as an R2 bucket, to make your content searchable with natural language. Each file becomes an <strong>item</strong> identified by an object <strong>key</strong> (its filename or path). The <a href="https://developers.cloudflare.com/ai-search/api/items/rest-api/">list items endpoint</a> returns the items in an instance.</p> <p>That endpoint now accepts a <code>key</code> query parameter, so you can look up a single item by its exact object key without paging through the full list. This complements the existing <code>item_id</code> filter for when you know the key but not the ID.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/&lt;ACCOUNT_ID&gt;/ai-search/instances/&lt;INSTANCE_NAME&gt;/items?key=docs/readme.md"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer &lt;API_TOKEN&gt;"</span></span></code></pre></figure> <p>Keys are unique per data source, so combine <code>key</code> with <code>source</code> (for example, <code>source=builtin</code>) to disambiguate when the same key exists across multiple sources.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/ai-search/api/items/rest-api/">managing items</a>.</p>Wed, 08 Jul 2026 00:00:00 GMTAI SearchAI SearchWorkers AI, AI Search - Workers AI toMarkdown and AI Search now supports GIF and BMP image conversionhttps://developers.cloudflare.com/changelog/post/2026-07-08-gif-bmp-image-support/https://developers.cloudflare.com/changelog/post/2026-07-08-gif-bmp-image-support/<p>Workers AI <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown conversion</a> (<code>toMarkdown</code>) now supports <code>.gif</code> and <code>.bmp</code> image files, in addition to the JPEG, PNG, WebP, and SVG formats already supported.</p> <p>GIF and BMP files run through the same <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/how-it-works/#images">image pipeline</a> as other formats. Each image is resized if needed (and for animated GIFs, only the first frame is used), then passed to an object-detection model to identify what it contains. Those detected objects prompt a vision model that writes a natural-language description of the image, which becomes searchable, machine-readable Markdown.</p> <p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> uses <code>toMarkdown</code> automatically to process the files it ingests, so any <code>.gif</code> and <code>.bmp</code> files are included the next time your index syncs, with no configuration changes required. This helps when your content mixes formats, for example a support knowledge base full of screenshots or an archive of BMP scans.</p> <p>Learn more about <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown conversion</a> and the full list of <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/#supported-file-types">AI Search's supported file types</a>.</p>Wed, 08 Jul 2026 00:00:00 GMTWorkers AIWorkers AIAI SearchCloudflare One, Cloudflare WAN - IPsec downgrade protection (beta)https://developers.cloudflare.com/changelog/post/2026-07-08-ipsec-downgrade-protection/https://developers.cloudflare.com/changelog/post/2026-07-08-ipsec-downgrade-protection/<p>Cloudflare IPsec now supports the <a href="https://datatracker.ietf.org/doc/draft-ietf-ipsecme-ikev2-downgrade-prevention/" target="_blank" rel="noopener"><code>IKE_SA_INIT_FULL_TRANSCRIPT_AUTH</code><span class="external-link"> ↗</span></a> IKEv2 extension to protect against downgrade attacks on IPsec tunnels.</p> <p>IKEv2's original authentication design has each endpoint sign only its own outbound messages, not the full handshake transcript. A quantum-capable <a href="https://www.cloudflare.com/learning/security/threats/on-path-attack/" target="_blank" rel="noopener">on-path attacker<span class="external-link"> ↗</span></a> can exploit this to bypass post-quantum key exchange by downgrading the connection to classical cryptography. The <code>IKE_SA_INIT_FULL_TRANSCRIPT_AUTH</code> extension addresses this by having both peers sign the entire handshake transcript during the authentication exchange, preventing an attacker from manipulating the negotiation without detection.</p> <p>Key details:</p> <ul> <li>Available in beta for Cloudflare WAN and Magic Transit IPsec tunnels.</li> <li>Cloudflare sends the <code>IKE_SA_INIT_FULL_TRANSCRIPT_AUTH</code> notification unconditionally as a responder when the feature flag is enabled.</li> <li>Both the initiator (your device) and responder (Cloudflare) must support the extension for downgrade protection to be effective.</li> <li>This feature is currently gated by a per-account feature flag. Contact your account team to turn it on.</li> </ul> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/#improved-downgrade-protection-beta">Downgrade protection</a> for more details.</p>Wed, 08 Jul 2026 00:00:00 GMTCloudflare OneCloudflare OneCloudflare WANCloudflare Network Firewall, Magic Transit, Cloudflare WAN - IP lists, IDS, and SIP rules supported in Unified Routinghttps://developers.cloudflare.com/changelog/post/2026-07-08-unified-routing-iplist-ids-sip/https://developers.cloudflare.com/changelog/post/2026-07-08-unified-routing-iplist-ids-sip/<p><a href="https://developers.cloudflare.com/cloudflare-network-firewall/">Cloudflare Advanced Network Firewall</a> IP lists, IDS, and SIP rules are now supported for accounts using <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta">Unified Routing</a> mode. These features require a Cloudflare Advanced Network Firewall subscription.</p> <p>Support for additional features - Threat Intel Lists, Rate Limiting, and Managed Rulesets - is planned.</p> <p>For the full list of current beta limitations, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations">Traffic steering beta limitations</a>.</p>Wed, 08 Jul 2026 00:00:00 GMTCloudflare Network FirewallCloudflare Network FirewallMagic TransitCloudflare WANR2 SQL - Query R2 Data Catalog tables with R2 SQL from the dashboardhttps://developers.cloudflare.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/https://developers.cloudflare.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/ <p>You can now query your <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> tables with <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> directly from the Cloudflare dashboard, without installing a CLI or wiring up a client. This makes it easy to explore your <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> data, validate queries, and inspect results in one place.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3080,height=1696,format=webp/_astro/r2-sql-studio.DCmHJaqy.png" alt="R2 SQL Query Editor" loading="lazy" decoding="async" width="3080" height="1696"> <p>To get started, go to <a href="https://dash.cloudflare.com/?to=/:account/data-catalog/overview" target="_blank" rel="noopener">R2 Data Catalog<span class="external-link"> ↗</span></a> in the Cloudflare dashboard and select <strong>Query data</strong> to launch the built-in SQL editor. From there you can:</p> <ul> <li><strong>Write and run queries interactively</strong> — Iterate on R2 SQL directly in the browser with syntax highlighting and autocomplete, instead of re-running commands through Wrangler or the REST API.</li> <li><strong>Explore your data</strong> — Explore your namespaces and tables alongside the editor so you can discover what's queryable without leaving the page or using other tools.</li> <li><strong>Understand results and performance</strong> — View result sets with per-query statistics, export them, and get helpful <code>EXPLAIN</code> outputs to see exactly how a query runs.</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Your R2 SQL credential is generated and stored for you and can be rotated in the R2 Data Catalog settings page.</p></div></div></aside>Wed, 08 Jul 2026 00:00:00 GMTR2 SQLR2 SQLWorkers AI - Moondream 3.1 now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-07-08-moondream3.1-workers-ai/https://developers.cloudflare.com/changelog/post/2026-07-08-moondream3.1-workers-ai/<p>Partnering with <a href="https://moondream.ai/" target="_blank" rel="noopener">Moondream<span class="external-link"> ↗</span></a> to bring their latest model <a href="https://developers.cloudflare.com/workers-ai/models/moondream3.1-9B-A2B/"><code>@cf/moondream/moondream3.1-9B-A2B</code></a> to Workers AI. Moondream 3.1 is a fast vision language model built on a mixture-of-experts architecture with 9B total parameters and 2B active, delivering frontier-level visual reasoning while retaining fast, cost-efficient inference.</p> <p>Moondream 3.1 is designed for real-world vision tasks, with a 32K token context window for handling complex queries and structured outputs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Query</strong> — ask open-ended questions about an image, with an optional reasoning parameter</li> <li><strong>Caption</strong> — generate short, normal, or long descriptions of an image</li> <li><strong>Point</strong> — return coordinates for objects matching a target phrase</li> <li><strong>Detect</strong> — return bounding boxes for objects matching a target phrase</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="real-time-vision-at-the-edge">Real-time vision at the edge</h4><a class="anchor-link" href="#real-time-vision-at-the-edge"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Vision workloads like live camera feeds, robotics, content moderation, and interactive agents need answers in milliseconds, not seconds. Moondream 3.1's small active footprint (2B active parameters) pairs well with Workers AI's serverless, globally distributed inference: requests run close to your users, and streaming responses start returning tokens almost immediately.</p> <p>In our testing, first tokens streamed back in roughly 20–30 ms, and results were fast across every task. The example end-to-end times below (client-observed median, including network round trip) are for a simple, single-subject image. Actual latency depends heavily on the image and how much detail you ask for.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Task</th> <th>End-to-end (p50)</th> </tr> </thead> <tbody> <tr> <td><code>query</code></td> <td>~770 ms</td> </tr> <tr> <td><code>caption</code></td> <td>~480 ms</td> </tr> <tr> <td><code>point</code></td> <td>~145 ms</td> </tr> <tr> <td><code>detect</code></td> <td>~160 ms</td> </tr> </tbody> </table></div> <p>At these speeds you can call the model inline while handling a request rather than pushing the work to a background queue or a separate service. That opens up use cases where a slow response breaks the experience: moderating user-uploaded images before they are stored, locating an object in a video frame to drive a live overlay, extracting fields from a document during a form submission, or letting an agent inspect a screenshot and decide its next step within a single turn.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Moondream 3.1 through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>) or the REST API at <code>/ai/run</code>. You can also use <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> with these endpoints.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/moondream3.1-9B-A2B/">Moondream 3.1 model page</a> and <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing</a>.</p>Wed, 08 Jul 2026 00:00:00 GMTWorkers AIWorkers AIWorkers - Cloudflare Drophttps://developers.cloudflare.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/https://developers.cloudflare.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/<p><a href="https://cloudflare.com/drop" target="_blank" rel="noopener">Cloudflare Drop<span class="external-link"> ↗</span></a> lets you deploy a static site to Cloudflare without requiring a Cloudflare account to get started.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2498,height=1294,format=webp/_astro/cloudflare-drag-and-drop-upload.KujM69eS.png" alt="Cloudflare Drag and Drop upload screen for browsing folders or ZIP files" loading="lazy" decoding="async" width="2498" height="1294"> <p>Upload a folder or zip file of static assets (static HTML, CSS, JavaScript, images, and fonts) and get a temporary live preview that stays live for 1 hour. During that window, you can test the site, share the preview URL, or <a href="https://developers.cloudflare.com/workers/platform/claim-deployments/">claim the deployment</a> to keep it.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2936,height=1594,format=webp/_astro/cloudflare-drag-and-drop-preview.BQ1__XRX.png" alt="Cloudflare Drag and Drop temporary live preview screen with claim and copy claim link actions" loading="lazy" decoding="async" width="2936" height="1594"> <p>When you are ready to make the deployment permanent, click <strong>Claim</strong> to sign in or create a Cloudflare account. You can claim the site into an existing Cloudflare account or create a new account for the deployment.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>If you are creating a new account, you will need to verify your email address before continuing.</p></div></div></aside><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=812,format=webp/_astro/cloudflare-drag-and-drop-claim.8Zv6px9B.png" alt="Cloudflare Drag and Drop claim account screen with a countdown before the claim link expires" loading="lazy" decoding="async" width="1712" height="812"> <p>After claiming the site, you can:</p> <ul> <li><strong>Add a domain</strong>: <a href="https://developers.cloudflare.com/workers/configuration/routing/custom-domains/">Connect</a> an existing domain or purchase a new one for your site.</li> <li><strong>Enable <a href="https://developers.cloudflare.com/workers/observability/">observability</a></strong>: Monitor your site's performance and usage.</li> <li><strong>Enable <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">Markdown for Agents</a></strong>: Allow AI agents to access your site's content in Markdown.</li> <li><strong>Control access</strong>: Make your site <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">private</a> and choose who can view it.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1812,height=1266,format=webp/_astro/cloudflare-drag-and-drop-post-claim.DvlaNmI7.png" alt="Claimed Cloudflare Drag and Drop site setup screen showing options to add a domain, control access, enable observability, and enable Markdown for agents" loading="lazy" decoding="async" width="1812" height="1266">Wed, 08 Jul 2026 00:00:00 GMTWorkersWorkersCloudflare One Client - Cloudflare One Client for Windows (version 2026.6.850.0)https://developers.cloudflare.com/changelog/post/2026-07-07-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-07-07-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This hotfix addresses a Windows authentication issue in the embedded WebView2 browser. Single sign-on could fail to use the Windows primary account, causing users to be prompted for an interactive sign-in. The embedded authentication browser now allows SSO providers to use the OS primary account when available.</p> Tue, 07 Jul 2026 18:35:35 GMTCloudflare One ClientCloudflare One ClientWorkflows - Workflows pricing adds per-step billing. Step and storage billing to start no earlier than August 10, 2026.https://developers.cloudflare.com/changelog/post/2026-07-07-workflows-billing-updates/https://developers.cloudflare.com/changelog/post/2026-07-07-workflows-billing-updates/<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> pricing now includes per-step billing. Requests and CPU time billing have been enabled since the initial public beta and is not changing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workflows-adds-step-billing">Workflows adds step billing</h4><a class="anchor-link" href="#workflows-adds-step-billing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A step is each unit of work executed by a Workflow, including step operations such as <a href="https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/">sleeping</a> or <a href="https://developers.cloudflare.com/workflows/build/events-and-parameters/">waiting for events</a>.</p> <p>You can query Workflows analytics, including <code>stepCount</code> for a Workflow instance, with the <a href="https://developers.cloudflare.com/workflows/observability/metrics-analytics/#query-via-the-graphql-api">GraphQL Analytics API</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="steps-and-storage-billing-to-take-effect-august-10th-2026">Steps and storage billing to take effect August 10th, 2026</h4><a class="anchor-link" href="#steps-and-storage-billing-to-take-effect-august-10th-2026"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Starting no earlier than August 10th, 2026, Cloudflare will begin billing for step and storage usage on Workers Paid plans.</p> <p>Storage pricing has been published since Workflows became generally available and is not changing. Storage is measured as persisted Workflow state in GB-months.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Dimension</th> <th>Workers Free</th> <th>Workers Paid</th> </tr> </thead> <tbody> <tr> <td>Steps</td> <td>3,000 included per day</td> <td>500,000 included per month, then $0.80 per additional 100,000 steps</td> </tr> <tr> <td>Storage</td> <td>1 GB-month included</td> <td>1 GB-month included, then $0.20 per additional GB-month</td> </tr> </tbody> </table></div> <p>Developers on the Workers Free plan will not be charged for steps or storage beyond the included amounts.</p> <p>Cloudflare will not bill step and storage usage before August 10, 2026.</p> <p>You can review Workflows usage in the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> before this change takes effect. To reduce costs, consider reducing the number of steps per Workflow or improving the memory efficiency of your stored state.</p> <p>Refer to the <a href="https://developers.cloudflare.com/workflows/reference/pricing/">Workflows pricing</a> page for full details.</p>Tue, 07 Jul 2026 12:00:00 GMTWorkflowsWorkflowsAccess, Cloudflare One - File transfer controls for browser-based RDP (beta)https://developers.cloudflare.com/changelog/post/2026-07-07-rdp-file-transfer-beta/https://developers.cloudflare.com/changelog/post/2026-07-07-rdp-file-transfer-beta/<p>You can now configure file transfer controls for browser-based RDP with Cloudflare Access, allowing you to restrict whether users can upload or download files between their local machine and the remote Windows server.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1356,height=692,format=webp/_astro/file-transfer-policy-control.CiSEa5rr.png" alt="File transfer connection settings in the Access policy configuration." loading="lazy" decoding="async" width="1356" height="692"> <p>This feature is useful for organizations that support bring-your-own-device (BYOD) policies or third-party contractors using unmanaged devices. By restricting file transfers, you can prevent sensitive data from being moved out of the remote session to a user's personal device.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration-options">Configuration options</h4><a class="anchor-link" href="#configuration-options"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>File transfer controls are configured per policy within your Access application, alongside existing <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#connection-settings">text clipboard controls</a>. For each policy, you can select one of the following options:</p> <ul> <li><strong>Client to remote RDP session allowed</strong> — Users can upload files from their local machine into the browser-based RDP session.</li> <li><strong>Remote RDP session to client allowed</strong> — Users can download files from the browser-based RDP session to their local machine.</li> <li><strong>Both directions allowed</strong> — Users can upload and download files between their local machine and the browser-based RDP session.</li> <li><strong>Disable copying/pasting</strong> — Users are not allowed to transfer files between their local machine and the browser-based RDP session.</li> </ul> <p>By default, file transfer is denied for new policies. For existing Access applications created before this feature was available, file transfer remains denied.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To upload, drag files into the browser window or select the settings gear icon on the left side of the RDP session. To download, copy a file in the remote session and select the settings gear to download it, download multiple files as a zip, or print PDFs to a local printer.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=812,height=532,format=webp/_astro/clipboard-side-panel.Us2RfXfs.png" alt="The clipboard side panel showing files available for transfer." loading="lazy" decoding="async" width="812" height="532"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=770,height=442,format=webp/_astro/remote-doc-ready-for-download-or-print-local.Dcm5hrGD.png" alt="A remote document ready for download or local printing." loading="lazy" decoding="async" width="770" height="442"> <p>This feature is in beta and available on all Zero Trust plans. For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#transfer-files">File transfer for browser-based RDP</a>.</p>Tue, 07 Jul 2026 00:00:00 GMTAccessAccessCloudflare OneBrowser Isolation, Cloudflare One - Browser Isolation support for authorization proxy endpointshttps://developers.cloudflare.com/changelog/post/2026-07-07-authorization-proxy-endpoint-support/https://developers.cloudflare.com/changelog/post/2026-07-07-authorization-proxy-endpoint-support/<p><a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">Browser Isolation</a> now supports Gateway <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint">authorization proxy endpoints</a>. You can apply <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/isolation-policies/">HTTP Isolate policies</a> to traffic routed through authorization proxy endpoints, the same way you can for traffic from the Cloudflare One Client.</p> <p>Previously, only <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint">source IP proxy endpoints</a> supported Browser Isolation, and only with non-identity policies. Because authorization proxy endpoints authenticate users through an identity provider, you can now apply identity-based Isolate policies to PAC file-proxied traffic without requiring the Cloudflare One Client.</p> <p>To get started, <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint">create an authorization proxy endpoint</a> and <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/isolation-policies/">build an Isolate policy</a>.</p>Tue, 07 Jul 2026 00:00:00 GMTBrowser IsolationBrowser IsolationCloudflare OneBrowser Run - New Browser Run endpoint for accessibility treeshttps://developers.cloudflare.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/https://developers.cloudflare.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> now supports a standalone <code>/accessibilityTree</code> endpoint, giving agent and automation workflows direct access to the browser's accessibility tree for a rendered webpage.</p> <p>An accessibility tree is the browser's structured view of a rendered page: roles, names, states, values, and hierarchy. It is useful for accessibility tooling, but also for AI agents and automation workflows that need page structure without the noise of raw HTML or the cost of screenshots.</p> <p>For AI agents, this means less inference from pixels and less parsing HTML. You can provide the page structure directly, helping agents identify available elements and determine which actions they can take.</p> <p>With the new <code>/accessibilityTree</code> endpoint, you can request the accessibility tree directly when you only need the semantic structure of a page. If you need multiple page formats in a single API call, you can use the <a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/"><code>/snapshot</code></a> endpoint, which also returns Markdown, HTML, and screenshots.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/&lt;accountId&gt;/browser-run/accessibilityTree'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com/"</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "success"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "result"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "accessibilityTree"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "role"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"RootWebArea"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Example Domain"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "children"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "role"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"heading"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Example Domain"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "level"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">1</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "role"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"link"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Learn more"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Use <code>interestingOnly</code> to return only semantically meaningful nodes, or <code>root</code> to capture the accessibility tree for a specific subtree.</p> <p>Refer to the <a href="https://developers.cloudflare.com/browser-run/quick-actions/accessibility-tree-endpoint/"><code>/accessibilityTree</code> documentation</a> for usage examples and supported parameters.</p>Tue, 07 Jul 2026 00:00:00 GMTBrowser RunBrowser RunLogs - New WebSocket Analytics Logpush datasethttps://developers.cloudflare.com/changelog/post/2026-07-07-websocket-analytics-dataset/https://developers.cloudflare.com/changelog/post/2026-07-07-websocket-analytics-dataset/<p>Enterprise customers can now push per-connection WebSocket analytics to any <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/">Logpush destination</a> using the new <code>websocket_analytics</code> dataset. Each log record is emitted when a WebSocket connection closes and includes fields that were previously only available to Cloudflare engineers via internal tooling.</p> <p>Key fields include:</p> <ul> <li><strong><code>ConnectionCloseReason</code></strong> — why the connection ended: <code>peerReset</code>, <code>peerNoError</code>, <code>timedOut</code>, <code>upstreamReset</code>, <code>protocolViolation</code>, <code>unspecifiedError</code>, or <code>none</code>.</li> <li><strong><code>ConnectionCloseSource</code></strong> — which side initiated the close: <code>upstream</code>, <code>downstream</code>, <code>me</code>, or <code>both</code>.</li> <li><strong><code>ConnectionTransportCloseCode</code></strong> — the TLS alert code or TCP-level close code for additional precision.</li> <li><strong><code>RayID</code></strong> — correlate WebSocket connection events with your existing HTTP Request logs.</li> </ul> <p>The dataset also includes directional byte counts (<code>BytesSentClient</code>, <code>BytesReceivedClient</code>, <code>BytesSentOrigin</code>, <code>BytesReceivedOrigin</code>), connection timestamps, client IP, colo code, and request metadata from the original WebSocket upgrade.</p> <p>This data lets you build alerts on connection close patterns — for example, detecting spikes in TCP resets (<code>ConnectionCloseReason == "peerReset"</code>) grouped by host and data center — directly in your existing log analysis tools.</p> <p>For the full list of available fields, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/websocket_analytics/">WebSocket Analytics</a>.</p>Tue, 07 Jul 2026 00:00:00 GMTLogsLogsR2, R2 Data Catalog - R2 Data Catalog warns before you delete data manuallyhttps://developers.cloudflare.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/https://developers.cloudflare.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> is a managed <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> catalog built directly into your R2 bucket. Iceberg tracks your data through a tree of metadata files, so every insert, update, and delete must go through a catalog transaction. Manually adding, modifying, or deleting objects outside the catalog can leave pointers referencing files that no longer exist, corrupting the table into an inconsistent state that is difficult to recover from.</p> <p>To help prevent this, the R2 dashboard and Wrangler now warn you when you attempt a manual delete operation on a Data Catalog-enabled bucket.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dashboard">Dashboard</h4><a class="anchor-link" href="#dashboard"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you try to delete objects from a bucket that has R2 Data Catalog enabled, the dashboard displays a warning explaining that the operation could leave the catalog in an invalid state, with a link to the documentation for deleting data correctly. You can cancel the operation or choose to proceed anyway.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1886,height=684,format=webp/_astro/data-catalog-delete-warning.DoBR0sFO.png" alt="R2 dashboard warning shown before deleting objects from a Data Catalog-enabled bucket" loading="lazy" decoding="async" width="1886" height="684"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="wrangler">Wrangler</h4><a class="anchor-link" href="#wrangler"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Wrangler now checks whether a bucket is Data Catalog-enabled before running a delete and warns you before continuing:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">Data Catalog is enabled for this bucket. </span></span> <span class="line"><span class="nb-shiki-wvjl67">Proceeding may leave the data catalog in an invalid state. Continue?</span></span></code></pre></figure> <p>To learn how to safely manage and delete data in your tables, refer to the <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog documentation</a>.</p>Tue, 07 Jul 2026 00:00:00 GMTR2R2R2 Data CatalogCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Self-serve registration of Cloudflare One Virtual Appliance in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-07-06-virtual-appliance-self-serve-ui/https://developers.cloudflare.com/changelog/post/2026-07-06-virtual-appliance-self-serve-ui/<p>You can now register a <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/">Cloudflare One Virtual Appliance</a> and generate its license key directly from the dashboard, without contacting your account team.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=988,format=webp/_astro/2026-07-06-virtual-appliance-self-serve-ui.Dn2NC_ql.gif" alt="Registering a Cloudflare One Virtual Appliance and generating its authentication key from the Connectors page" loading="lazy" decoding="async" width="1800" height="988"> <ul> <li>On the <strong>Connectors</strong> page, select <strong>Add an appliance</strong> and choose <strong>Virtual appliance</strong> to register a virtual appliance and generate its authentication key.</li> <li>Use <strong>Regenerate authentication key</strong> from a virtual appliance connector's menu to rotate its key. The previous key is immediately and irrevocably revoked.</li> <li>The authentication key is shown only once — copy and store it securely.</li> </ul> <p>This complements the existing <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/#register-a-virtual-appliance-and-generate-a-license-key">API and Terraform self-serve workflow</a> for provisioning virtual appliances. Hardware appliances continue to use the existing account-team fulfillment workflow.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/">Configure a Cloudflare One Virtual Appliance</a>.</p>Mon, 06 Jul 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANDurable Objects, Workers - Declare Durable Object class lifecycle with `exports`https://developers.cloudflare.com/changelog/post/2026-06-30-declarative-do-class-exports/https://developers.cloudflare.com/changelog/post/2026-06-30-declarative-do-class-exports/<p>A new declarative <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/"><code>exports</code></a> field in your Wrangler configuration file replaces the imperative <a href="https://developers.cloudflare.com/durable-objects/reference/durable-object-class-migrations-legacy/"><code>migrations</code></a> array for managing Durable Object class lifecycle. Instead of writing an ordered list of migration steps with unique tags, you declare each Durable Object class your Worker exports and Cloudflare compares that against what's already deployed to determine what Durable Object state needs to be created, renamed, or deleted.</p> <p>With legacy migrations, renaming <code>ChatRoom</code> to <code>Room</code> requires retaining both tagged steps:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="jsonc"><figcaption class="nb-code-title"><span class="nb-code-title-name">Before — legacy migrations</span><span class="nb-code-title-lang">jsonc</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"tag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"v1"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"new_sqlite_classes"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"ChatRoom"</span><span class="nb-shiki-140thh">] },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"v2"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "renamed_classes"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"from"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"ChatRoom"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"to"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Room"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>With <code>exports</code>, you instead declare <code>Room</code> as the current class and mark <code>ChatRoom</code> as renamed:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="jsonc"><figcaption class="nb-code-title"><span class="nb-code-title-name">After — declarative exports</span><span class="nb-code-title-lang">jsonc</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "exports"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ChatRoom"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"durable-object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "state"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"renamed"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "renamed_to"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Room"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "Room"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"durable-object"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"storage"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"sqlite"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Each entry is keyed by class name. The <code>state</code> field carries the lifecycle (<code>created</code> by default — a live class — plus tombstone states <code>deleted</code>, <code>renamed</code>, and <code>transferred</code>, and the <code>expecting-transfer</code> receiving state for cross-Worker transfers).</p> <p>Key improvements over the legacy <code>migrations</code> array:</p> <ul> <li><strong>No migration tags.</strong> The current <code>exports</code> map is the source of truth — there is no historical chain of <code>v1</code>, <code>v2</code>, <code>v3</code> entries to maintain.</li> <li><strong>Structured deployment output.</strong> Wrangler reports when it creates, updates, deletes, renames, or transfers Durable Object classes. It also identifies stale configuration entries that are safe to remove. Deployments with no changes or notices do not print this output.</li> <li><strong>Zero-downtime rename and transfer patterns are first-class.</strong> Tombstones may coexist with the source class still in code, enabling a <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#avoid-downtime-during-a-rename">three-deploy rename</a> and a <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#transfer-a-durable-object-class-between-workers">four-deploy cross-Worker transfer</a> without runtime errors during the rollout window.</li> <li><strong>Cross-Worker safety.</strong> When you delete or rename a class, Cloudflare lists every other Worker in your account whose bindings still reference the namespace, so you can redeploy them before the change goes live.</li> </ul> <p>Existing Workers using the legacy <a href="https://developers.cloudflare.com/durable-objects/reference/durable-object-class-migrations-legacy/"><code>migrations</code></a> array continue to work unchanged. To move to <code>exports</code>, refer to the <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#migrate-from-the-legacy-migrations-flow">migration guide</a>. <code>exports</code> and <code>migrations</code> are mutually exclusive within a single Worker.</p> <p>For the full reference, refer to <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/">Durable Object class exports</a>.</p>Sat, 04 Jul 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersWorkers - Simpler runtime types with @cloudflare/workers-types v5https://developers.cloudflare.com/changelog/post/2026-07-03-workers-types-v5/https://developers.cloudflare.com/changelog/post/2026-07-03-workers-types-v5/ <p>We have released version 5 of <a href="https://www.npmjs.com/package/@cloudflare/workers-types" target="_blank" rel="noopener"><code>@cloudflare/workers-types</code><span class="external-link"> ↗</span></a>. This release simplifies the package to expose only the latest runtime types.</p> <p>We still recommend that you generate types for your Worker using <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#types"><code>wrangler types</code></a>, but if you want to use the package directly, you can install it with your package manager of choice:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-npm" id="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-yarn" id="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-pnpm" id="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-bun" id="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-npm" aria-labelledby="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i -D @cloudflare/workers-types@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i -D @cloudflare/workers-types@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-yarn" aria-labelledby="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add -D @cloudflare/workers-types@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add -D @cloudflare/workers-types@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-pnpm" aria-labelledby="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add -D @cloudflare/workers-types@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add -D @cloudflare/workers-types@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-84926c01-b9ed-4857-8936-d700b0fe1291-bun" aria-labelledby="pm-tab-pm-84926c01-b9ed-4857-8936-d700b0fe1291-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add -d @cloudflare/workers-types@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add -d @cloudflare/workers-types@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>The package now exposes two entrypoints:</p> <ul> <li><code>@cloudflare/workers-types</code> reflects the latest compatibility date, using the latest stable compatibility flags.</li> <li><code>@cloudflare/workers-types/experimental</code> reflects APIs behind experimental compatibility flags.</li> </ul> <p>The dated entrypoints, such as <code>@cloudflare/workers-types/2022-11-30</code> and <code>@cloudflare/workers-types/2023-03-01</code>, are removed. With runtime type generation in <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler v4</a>, you can generate these with the <code>wrangler types</code> command to create types locked to your Worker's compatibility date.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers/languages/typescript/">TypeScript language support</a>.</p>Fri, 03 Jul 2026 00:00:00 GMTWorkersWorkersAI Search - Manage AI Search sync jobs with Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-07-02-manage-sync-jobs/https://developers.cloudflare.com/changelog/post/2026-07-02-manage-sync-jobs/<p>When you connect a <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/">data source</a> to your <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> instance, AI Search runs sync jobs to keep your index up to date with your content. You can now manage those jobs directly from <a href="https://developers.cloudflare.com/ai-search/wrangler-commands/">Wrangler</a>.</p> <p>For example, you can trigger a sync job from your CI/CD or automated pipelines with the <code>jobs create</code> command so your index refreshes when you push a change:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> jobs</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-instance</span></span></code></pre></figure> <p>This creates an asynchronous sync job that checks for changes in your data source, and sends new, modified, or deleted files to be indexed. The following commands are available:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>wrangler ai-search jobs create</code></td> <td>Trigger a new sync job</td> </tr> <tr> <td><code>wrangler ai-search jobs list</code></td> <td>List sync jobs for an instance</td> </tr> <tr> <td><code>wrangler ai-search jobs get</code></td> <td>Get details for a job</td> </tr> <tr> <td><code>wrangler ai-search jobs cancel</code></td> <td>Cancel a running job</td> </tr> <tr> <td><code>wrangler ai-search jobs logs</code></td> <td>View log entries for a job</td> </tr> </tbody> </table></div> <p>All commands accept <code>--namespace</code>/<code>-n</code> (defaults to <code>default</code>) and <code>--json</code> for structured output that automation and AI agents can parse directly. The <code>list</code> and <code>logs</code> commands also support <code>--page</code> and <code>--per-page</code> for pagination, and <code>cancel</code> prompts for confirmation unless you pass <code>-y</code>/<code>--force</code>.</p> <p>For full usage details, refer to the <a href="https://developers.cloudflare.com/ai-search/wrangler-commands/">AI Search Wrangler commands documentation</a>.</p>Thu, 02 Jul 2026 00:00:00 GMTAI SearchAI SearchCache - Cache multiple versions of a URL with Varyhttps://developers.cloudflare.com/changelog/post/2026-07-02-vary-for-cache-rules/https://developers.cloudflare.com/changelog/post/2026-07-02-vary-for-cache-rules/<p>Your origin can serve different responses for the same URL — different languages based on <code>Accept-Language</code>, or different formats based on <code>Accept</code> — by returning a <a href="https://www.rfc-editor.org/rfc/rfc9110.html#name-vary" target="_blank" rel="noopener"><code>Vary</code><span class="external-link"> ↗</span></a> response header. Cloudflare's cache now honors that header directly in <a href="https://developers.cloudflare.com/cache/how-to/cache-rules/">Cache Rules</a>, so the same URL can hold multiple cached versions and each request is matched to the right one. Content that previously had to bypass cache to stay correct can now be cached, following standard <a href="https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-cache-keys-with" target="_blank" rel="noopener">HTTP caching behavior<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Your origin now decides which request headers matter by listing them in its <code>Vary</code> response, and you control how Cloudflare treats each one. When you have enabled Vary using a cache rule and a response includes a <code>Vary</code> header, the request headers listed become part of the cache key.</p> <p>For each header your origin varies on, choose one of three actions:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Action</th> <th>Behavior</th> <th>Best for</th> </tr> </thead> <tbody> <tr> <td><code>normalize</code></td> <td>Converts equivalent header values to the same cache key value before matching, collapsing redundant versions.</td> <td>Most <code>Accept</code>, <code>Accept-Language</code>, and <code>Accept-Encoding</code> use cases.</td> </tr> <tr> <td><code>passthrough</code></td> <td>Uses the raw header value to select the cached version and forwards it to the origin unchanged.</td> <td>When byte-for-byte differences in the header value should create versions.</td> </tr> <tr> <td><code>bypass</code></td> <td>Bypasses cache whenever this header name appears in the origin's <code>Vary</code> response.</td> <td>Per-user values, or headers with too many possible values to cache safely.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Higher cache hit ratios</strong>: <code>normalize</code> treats semantically equivalent headers as one version. For example, <code>Accept-Language: en-US, fr;q=0.8</code> and <code>Accept-Language: fr;q=0.8, en-GB</code> both resolve to the same cache key, so you serve more requests from cache instead of the origin.</li> <li><strong>Correct content negotiation</strong>: Requests always receive the cached version that matches their headers, so language and format variants stay accurate.</li> <li><strong>No origin or Worker changes required</strong>: If your origin already sends <code>Vary</code>, you configure the behavior entirely in Cache Rules.</li> <li><strong>Standards-aligned</strong>: Cache key calculation follows RFC 9111, and <code>Vary: *</code> continues to bypass cache as required by RFC 9110.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Vary in Cache Rules is available on all plans (Free, Pro, Business, and Enterprise). For per-request control in Workers subrequests, use the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#the-cfvary-property"><code>cf.vary</code></a> property.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Configure Vary in the <a href="https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> under <strong>Caching</strong> &gt; <strong>Cache Rules</strong>, or through the <a href="https://developers.cloudflare.com/ruleset-engine/rulesets-api/">Rulesets API</a>. To learn how Vary affects cache keys and how each action works, refer to <a href="https://developers.cloudflare.com/cache/concepts/vary/">Vary</a> and the <a href="https://developers.cloudflare.com/cache/how-to/cache-rules/settings/#vary">Cache Rules Vary setting</a>.</p>Thu, 02 Jul 2026 00:00:00 GMTCacheCacheLogs - Updated fields across multiple Logpush datasets in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2026-07-02-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-07-02-log-fields-updated/<p>Cloudflare has updated <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updated-fields-in-existing-datasets">Updated fields in existing datasets</h4><a class="anchor-link" href="#updated-fields-in-existing-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Gateway DNS</strong> (added): <code>AppliedMaxTTL</code> and <code>UpstreamRecordTTLs</code>.</li> <li><strong>Gateway HTTP</strong> (added): <code>Warnings</code>.</li> <li><strong>HTTP requests</strong> (added): <code>CacheLockWaitedMs</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Thu, 02 Jul 2026 00:00:00 GMTLogsLogsCloudflare Mesh, Cloudflare One - Hostname routing for Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-07-02-mesh-hostname-routing/https://developers.cloudflare.com/changelog/post/2026-07-02-mesh-hostname-routing/ <p>You can now add <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes">hostname routes</a> to a Cloudflare Mesh node, in addition to CIDR routes.</p> <figure class="mesh-hostname-diagram not-content" aria-label="How hostname routing works with a Cloudflare Mesh node: a client requests a hostname, Cloudflare Gateway assigns a token IP and rewrites the destination, and the Mesh node delivers the traffic to the private host" data-astro-cid-7hjhdnhq><ol class="flow" data-astro-cid-7hjhdnhq><li class="flow-step" data-astro-cid-7hjhdnhq><div class="node-card client-card" data-astro-cid-7hjhdnhq><div class="node-header" data-astro-cid-7hjhdnhq><span class="node-icon client-icon" aria-hidden="true" data-astro-cid-7hjhdnhq><svg width="0.98em" height="1em" viewBox="0 0 48 49" data-astro-cid-7hjhdnhq="true" data-icon="warp-client"><path fill="currentColor" d="M24 5.04a19.5 19.5 0 1 0 19.5 19.5A19.575 19.575 0 0 0 24 5.04m0 3a16.575 16.575 0 0 1 16.5 16.5 16.8 16.8 0 0 1-2.175 8.175c.302-1.125.453-2.285.45-3.45a14.775 14.775 0 0 0-29.55 0 13.2 13.2 0 0 0 .45 3.45A16.8 16.8 0 0 1 7.5 24.54 16.575 16.575 0 0 1 24 8.04m-5.25 30.6a6.974 6.974 0 1 1 10.5 0 5.25 5.25 0 0 0-10.5 0M24 24.015a9.976 9.976 0 0 0-9.975 10.05c-.024.53.026 1.06.15 1.575a11.5 11.5 0 0 1-1.95-6.375 11.775 11.775 0 0 1 23.55 0 11.47 11.47 0 0 1-1.95 6.375 5.6 5.6 0 0 0 .15-1.575A9.974 9.974 0 0 0 24 24.015M21.75 38.79A2.25 2.25 0 1 1 24 41.04a2.174 2.174 0 0 1-2.25-2.25"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/" data-astro-cid-7hjhdnhq>Client device</a></div><p class="node-caption" data-astro-cid-7hjhdnhq>Requests <code data-astro-cid-7hjhdnhq>wiki.internal.local</code></p></div></li><li class="flow-connector" data-astro-cid-7hjhdnhq><span class="connector-label" data-astro-cid-7hjhdnhq>DNS query</span><span class="connector-arrow" aria-hidden="true" data-astro-cid-7hjhdnhq>↓</span></li><li class="flow-step" data-astro-cid-7hjhdnhq><div class="node-card gateway-card" data-astro-cid-7hjhdnhq><div class="node-header" data-astro-cid-7hjhdnhq><span class="node-icon gateway-icon" aria-hidden="true" data-astro-cid-7hjhdnhq><svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-7hjhdnhq="true" data-icon="gateway"><path fill="currentColor" d="M15.45 7.125h-2.577V3.508l-.41-.408H3.925l-.41.41v3.08h.922V4.023h7.513v7.555H4.438v-1.553h-.923v2.065l.41.41h8.538l.41-.41V8.048H16z"/><path fill="currentColor" d="M8.453 7.238H0l.517.87H8.97zM9.21 8.51H.755l.517.868h8.453z"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/" data-astro-cid-7hjhdnhq>Cloudflare Gateway</a></div><p class="node-caption" data-astro-cid-7hjhdnhq>Returns a token IP, then rewrites the destination to the real private IP.</p><div class="pill-row" data-astro-cid-7hjhdnhq><span class="token-pill" data-astro-cid-7hjhdnhq><code data-astro-cid-7hjhdnhq>172.64.128.0/20</code></span></div></div></li><li class="flow-connector" data-astro-cid-7hjhdnhq><a class="connector-label" href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes" data-astro-cid-7hjhdnhq>Hostname route</a><span class="connector-arrow" aria-hidden="true" data-astro-cid-7hjhdnhq>↓</span></li><li class="flow-step" data-astro-cid-7hjhdnhq><div class="node-card mesh-card" data-astro-cid-7hjhdnhq><div class="node-header" data-astro-cid-7hjhdnhq><span class="node-icon mesh-icon" aria-hidden="true" data-astro-cid-7hjhdnhq><svg width="1em" height="1em" viewBox="0 0 32 32" data-astro-cid-7hjhdnhq="true" data-icon="cloudflare-mesh"><path fill="currentColor" d="M10 6a2 2 0 1 1-4 0 2 2 0 0 1 4 0m6-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 4a2 2 0 1 0 0-4 2 2 0 0 0 0 4M8 11a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4M8 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m0 7a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8-7a2 2 0 1 0 0 4 2 2 0 0 0 0-4"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/" data-astro-cid-7hjhdnhq>Mesh node</a></div><p class="node-caption" data-astro-cid-7hjhdnhq>Forwards traffic to the host on the local network</p></div></li><li class="flow-connector" aria-hidden="true" data-astro-cid-7hjhdnhq><span class="connector-arrow" data-astro-cid-7hjhdnhq>↓</span></li><li class="flow-step" data-astro-cid-7hjhdnhq><div class="node-card host-card" data-astro-cid-7hjhdnhq><div class="node-header" data-astro-cid-7hjhdnhq><span class="node-icon host-icon" aria-hidden="true" data-astro-cid-7hjhdnhq><svg width="1em" height="1em" viewBox="0 0 48 48" data-astro-cid-7hjhdnhq="true" data-icon="dns"><path fill="currentColor" d="M39 30.98h-2.125v-8.574H25.148v-5.449h2.102l1.25-1.25V9l-1.25-1.25h-6.738L19.262 9v6.707l1.25 1.25h2.136v5.45H11.125v8.573H9l-1.25 1.25V39L9 40.25h6.742l1.25-1.25v-6.77l-1.25-1.25h-2.117v-6.074h9.023v6.074h-2.136l-1.25 1.25V39l1.25 1.25h6.738L28.5 39v-6.77l-1.25-1.25h-2.102v-6.074h9.235v6.074h-2.121l-1.25 1.25V39l1.25 1.25H39L40.25 39v-6.77ZM21.762 10.25H26v4.238h-4.238Zm-7.27 27.5H10.25v-4.27h4.238Zm11.508 0h-4.238v-4.27H26Zm11.75 0h-4.238v-4.27h4.238Z"/></svg></span><span class="node-title" data-astro-cid-7hjhdnhq>Private host</span></div><p class="node-caption" data-astro-cid-7hjhdnhq><code data-astro-cid-7hjhdnhq>wiki.internal.local</code> · <code data-astro-cid-7hjhdnhq>10.0.0.50</code></p></div></li></ol></figure> <p>Instead of managing IP ranges, you can attract traffic for a hostname to a Mesh node:</p> <ul> <li><strong>Private hostname</strong> (for example, <code>wiki.internal.local</code>) — reach an internal application by name, which is useful when it has an unknown or ephemeral IP. On Mesh you do not need to run a DNS server; a local hosts-file entry on the node is enough, or you can use a Gateway resolver policy for split DNS.</li> <li><strong>Public hostname</strong> (for example, <code>www.example.com</code>) — route that hostname's traffic through the node and egress via the node's public IP.</li> </ul> <a href="https://dash.cloudflare.com/?to=/:account/mesh" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Mesh</strong>&nbsp;&#8599;</a> <p>For setup steps, prerequisites, and DNS options, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes">Hostname routes</a>.</p>Thu, 02 Jul 2026 00:00:00 GMTCloudflare MeshCloudflare MeshCloudflare OneWorkers - Work across multiple accounts with Wrangler auth profileshttps://developers.cloudflare.com/changelog/post/2026-07-02-wrangler-auth-profiles/https://developers.cloudflare.com/changelog/post/2026-07-02-wrangler-auth-profiles/<p><a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler CLI</a> now supports auth profiles: named logins that you scope to specific Cloudflare accounts and switch between automatically, based on the directory you are working in.</p> <p>A profile is a named OAuth login bound to a directory. Commands run in that directory, and its subdirectories, use the matching account — so you can move between accounts without re-running <code>wrangler login</code>.</p> <p>Use profiles to keep a separate login for each client when working at an agency, or to separate staging and production into different accounts. Pair a profile with an <code>account_id</code> in your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">Wrangler configuration file</a> so a command cannot reach the wrong account.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Create a profile for each account, choosing which accounts it can reach</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> client-a</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> activate</span><span class="nb-shiki-mdbnqw"> client-a</span><span class="nb-shiki-mdbnqw"> ~/clients/client-a</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> client-b</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> activate</span><span class="nb-shiki-mdbnqw"> client-b</span><span class="nb-shiki-mdbnqw"> ~/clients/client-b</span></span></code></pre></figure> <p>Use the <code>--profile</code> flag to run a single command with a specific profile:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-dzsirb"> --profile</span><span class="nb-shiki-mdbnqw"> personal</span></span></code></pre></figure> <p>In CI and other automated environments, <code>CLOUDFLARE_API_TOKEN</code> still takes precedence over all profiles.</p> <p>For setup, the resolution order, and the full command reference, refer to <a href="https://developers.cloudflare.com/workers/wrangler/profiles/">Authentication profiles</a>.</p>Thu, 02 Jul 2026 00:00:00 GMTWorkersWorkersCloudflare One Client - Cloudflare One Client for Linux (version 2026.6.836.0)https://developers.cloudflare.com/changelog/post/2026-07-01-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-07-01-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This package is the same release as 2026.6.822.0, with a fix for our RPM package. Previously the repository served a single build to every OS version, so an install could pull a dependency that isn&#39;t available on that release. The repository now serves the correct build for each operating system version, so installs automatically pull the dependencies that version requires. Debian and Ubuntu were not affected.</p> <p>If you installed version 2026.6.822.0 on an RPM-based distribution, we recommend refreshing your repository configuration:</p> <pre><code class="language-bash">sudo curl -fsSL https://pkg.cloudflareclient.com/cloudflare-warp-ascii.repo | sudo tee /etc/yum.repos.d/cloudflare-warp.repo sudo dnf clean all sudo dnf install cloudflare-warp </code></pre> Wed, 01 Jul 2026 19:48:17 GMTCloudflare One ClientCloudflare One ClientAccess - Fix redirect URL fragment encoding for single-page applicationshttps://developers.cloudflare.com/changelog/post/2026-07-01-spa-redirect-fragment-fix/https://developers.cloudflare.com/changelog/post/2026-07-01-spa-redirect-fragment-fix/<p>Access now correctly preserves URL fragment characters (<code>/</code>, <code>?</code>, <code>=</code>, <code>&amp;</code>, <code>;</code>) when redirecting users back to an application after login. Previously, these characters were encoded with <code>encodeURIComponent</code>, which mangled fragment-based routes used by single-page applications (SPAs).</p> <p>For example, an SPA URL like <code>https://app.example.com/#/dashboard?tab=settings&amp;view=advanced</code> would previously redirect to a broken URL after login. This is now handled correctly.</p> <p>If your SPA users were experiencing broken navigation after authenticating through Access, this fix resolves the issue without any configuration changes.</p>Wed, 01 Jul 2026 00:00:00 GMTAccessAccessAccess - Independent MFA for infrastructure applicationshttps://developers.cloudflare.com/changelog/post/2026-07-01-ssh-mfa-piv-keys/https://developers.cloudflare.com/changelog/post/2026-07-01-ssh-mfa-piv-keys/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/">Access for Infrastructure</a> now supports independent multi-factor authentication (MFA) for SSH connections using YubiKey PIV keys. This adds a hardware-backed second factor to SSH access, ensuring that a compromised device session alone is not sufficient to reach your servers.</p> <p>With per-application and per-policy configuration, you can enforce PIV key authentication for sensitive usernames (for example, <code>root</code>) while applying different requirements for other usernames. You can also set an MFA session duration to control how often users must re-authenticate.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enrollment">Enrollment</h4><a class="anchor-link" href="#enrollment"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Users enroll their YubiKey PIV key through the <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/">App Launcher</a>. For enrollment instructions and SSH client setup, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#enroll-a-piv-key-for-infrastructure-apps">Enroll a PIV key for infrastructure apps</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration">Configuration</h4><a class="anchor-link" href="#configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/mfa-requirements/#infrastructure-applications">Enforce MFA for infrastructure applications</a>.</p>Wed, 01 Jul 2026 00:00:00 GMTAccessAccessBots - New options to manage AI traffichttps://developers.cloudflare.com/changelog/post/2026-07-01-ai-traffic-options/https://developers.cloudflare.com/changelog/post/2026-07-01-ai-traffic-options/<p>Not all AI traffic is the same. Now, all customers — including those on the Free plan — can manage AI crawlers based on what they actually do on your site. Cloudflare groups AI traffic into three behaviors you can control independently: <a href="https://developers.cloudflare.com/bots/concepts/bot/#ai-bots">Search, Agent, and Training</a>. This lets you keep the automated traffic that sends readers and revenue back to you, while blocking the traffic that only takes from your content.</p> <p>Each behavior maps to a real use case. <strong>Search</strong> covers crawlers that index your content so they can answer questions about it later, where you should expect referral traffic or other equitable compensation in return. <strong>Agent</strong> covers automated activity acting in real time on a person's behalf, such as chat fetch bots and browser-use agents. <strong>Training</strong> covers crawlers that take your content to train or fine-tune a model. For each preset you can choose to block on all pages, block only on pages that display ads, or choose not to block.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=4720,height=2966,format=webp/_astro/ai-bot-traffic-policies.BqXU7Gmv.png" alt="The Configure AI bot traffic policies screen, where Search, Agent, and Training can each be set to allow, block, or block only on pages with ads" loading="lazy" decoding="async" width="4720" height="2966"> <p>Starting <strong>September 15, 2026</strong>, new domains onboarding to Cloudflare receive updated defaults: Bots classified as Training or as Agent are blocked on pages that display ads, while <strong>Search</strong> remains allowed. On that date, multi-purpose crawlers that combine Search and Training will be affected by the new defaults to block Training. All customers can <a href="https://dash.cloudflare.com/?to=/:account/:zone/security/settings" target="_blank" rel="noopener">opt out of the new defaults<span class="external-link"> ↗</span></a> at any time before September 15.</p>Wed, 01 Jul 2026 00:00:00 GMTBotsBotsBots - More visibility into bot traffic with BotBase and Attribution Business Insightshttps://developers.cloudflare.com/changelog/post/2026-07-01-botbase-attribution-business-insights/https://developers.cloudflare.com/changelog/post/2026-07-01-botbase-attribution-business-insights/<p>With Content Independence Day 2026, <a href="https://developers.cloudflare.com/bots/get-started/bot-management/">Enterprise Bot Management</a> customers get two new tools that make bot traffic far easier to see and reason about: <a href="https://developers.cloudflare.com/bots/botbase/">BotBase</a>, a searchable directory of every bot Cloudflare tracks, and <a href="https://developers.cloudflare.com/bots/attribution-business-insights/">Attribution Business Insights</a>, a dashboard that shows how much value each crawler sends back to your business.</p> <p>BotBase is Cloudflare's directory of all known bots and agents, available directly in the dashboard. It shows how Cloudflare classifies each bot by behavior — Search, Agent, Training, and other categories such as Transact, Data Collection, SEO, and Ads Verification — so you can understand why a given crawler is visiting you. You can search and filter the full catalogue, filter your own traffic down to a single bot to investigate its activity on your zone, and copy any bot's detection ID to target it precisely in <a href="https://developers.cloudflare.com/security/rules/">Security rules</a>. Every tracked bot in BotBase is also published in <a href="https://radar.cloudflare.com/bots/directory" target="_blank" rel="noopener">Cloudflare Radar's bots and agents directory<span class="external-link"> ↗</span></a>.</p> <p>Attribution Business Insights is built for content owners and business decision-makers who want to know which bots help or harm their business, without reading rule syntax. The dashboard reports crawl-to-referral ratios both site-wide and per bot operator — comparing how often a company crawls your content against how many visitors it actually refers back — over the last 24 hours, 7 days, or 30 days. Each operator is labeled with Cloudflare's <a href="https://developers.cloudflare.com/bots/concepts/bot/verified-bots/">updated classification</a> and an action status of Allowed, Blocked, or Partially blocked, giving stakeholders a shared, at-a-glance view of the AI traffic reaching your site.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=8192,height=5064,format=webp/_astro/attribution-business-insights.Cu-ZtxkX.png" alt="The Attribution Business Insights dashboard, showing bot traffic, content page requests, crawl-to-referral ratio, and a per-operator bot activity table" loading="lazy" decoding="async" width="8192" height="5064">Wed, 01 Jul 2026 00:00:00 GMTBotsBotsContainers - Use Google Artifact Registry images with Containershttps://developers.cloudflare.com/changelog/post/2026-07-01-google-artifact-registry-images/https://developers.cloudflare.com/changelog/post/2026-07-01-google-artifact-registry-images/ <p>Containers now support <a href="https://cloud.google.com/artifact-registry" target="_blank" rel="noopener">Google Artifact Registry<span class="external-link"> ↗</span></a> images. After you configure credentials, you can use a fully qualified Google Artifact Registry image reference in your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#containers">Wrangler configuration</a> instead of first pushing the image to Cloudflare Registry.</p> <p>Provide the service account email with <code>--gar-email</code> and pipe the service account JSON key through <code>stdin</code>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">cat</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">PATH_TO_KE</span><span class="nb-shiki-140thh">Y</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> containers</span><span class="nb-shiki-mdbnqw"> registries</span><span class="nb-shiki-mdbnqw"> configure</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">REGIO</span><span class="nb-shiki-140thh">N</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">-docker.pkg.dev</span><span class="nb-shiki-dzsirb"> --gar-email=</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-dzsirb">SERVICE_ACCOUNT_EMAIL</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --secret-name=</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-dzsirb">SECRET_NAME</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "image"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;REGION>-docker.pkg.dev/&#x3C;PROJECT_ID>/&#x3C;REPOSITORY>/&#x3C;IMAGE>:&#x3C;TAG>"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-21nrsd"># Example: us-central1-docker.pkg.dev/my-project/my-repo/my-image:latest</span></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">image = </span><span class="nb-shiki-mdbnqw">"&#x3C;REGION>-docker.pkg.dev/&#x3C;PROJECT_ID>/&#x3C;REPOSITORY>/&#x3C;IMAGE>:&#x3C;TAG>"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Only <code>*-docker.pkg.dev</code> hosts are supported. To configure credentials, refer to <a href="https://developers.cloudflare.com/containers/platform-details/image-management/#use-private-google-artifact-registry-images">Use private Google Artifact Registry images</a>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/containers/platform-details/image-management/">Image management</a>.</p>Wed, 01 Jul 2026 00:00:00 GMTContainersContainersCloudflare Images - Images binding is now billed per unique transformationhttps://developers.cloudflare.com/changelog/post/2026-07-01-binding-unique-transformations/https://developers.cloudflare.com/changelog/post/2026-07-01-binding-unique-transformations/<p>The <a href="https://developers.cloudflare.com/images/optimization/binding/">Images binding</a> is now billed per unique transformation, matching the model already used for URL-based transformations. Repeat requests for the same combination of source image and parameters within the same calendar month are counted only once.</p> <p>Previously, every call to the binding counted as a separate transformation regardless of whether the image or parameters were unique. With this change, you can call the binding on hot paths without paying for each individual request.</p> <p>Calls to <a href="https://developers.cloudflare.com/images/optimization/binding/#infostream"><code>.info()</code></a> are no longer billed.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/images/pricing/#images-transformed">Images pricing</a> and the <a href="https://developers.cloudflare.com/images/optimization/binding/">Images binding documentation</a>.</p>Wed, 01 Jul 2026 00:00:00 GMTCloudflare ImagesCloudflare ImagesVectorize - Reduced end-to-end latency for vector changeshttps://developers.cloudflare.com/changelog/post/2026-06-30-improved-wal-throughput/https://developers.cloudflare.com/changelog/post/2026-06-30-improved-wal-throughput/<p>We have greatly improved the throughput of the Vectorize <a href="https://blog.cloudflare.com/building-vectorize-a-distributed-vector-database-on-cloudflare-developer-platform/#the-wal" target="_blank" rel="noopener">write-ahead log (WAL)<span class="external-link"> ↗</span></a>. As a result, we have significantly reduced the end-to-end latency for a vector change to become queryable: median latency has dropped from 2 minutes to under 30 seconds, and p99 latency from 5 minutes to under 2 minutes.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2542,height=1184,format=webp/_astro/vectorize-p99-wal-batch-end-to-end-latency-improvement.k8gtzlG7.png" alt="Vectorize p99 WAL batch end-to-end latency improved" loading="lazy" decoding="async" width="2542" height="1184"> <p>This means inserts, upserts, and deletes are reflected in query results faster, improving the freshness of semantic search, recommendation, and retrieval-augmented generation (RAG) workloads. You do not need to change your code or configuration to benefit from this improvement.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/vectorize/">Vectorize documentation</a>.</p>Wed, 01 Jul 2026 00:00:00 GMTVectorizeVectorizeWAF - WAF Release - 2026-07-01https://developers.cloudflare.com/changelog/post/2026-07-01-waf-release/https://developers.cloudflare.com/changelog/post/2026-07-01-waf-release/ <p>This release adds targeted coverage for a path traversal flaw in Fortinet FortiSandbox (CVE-2026-39813) and transitions the Anomaly:Header:User-Agent - Fake Bing or MSN Bot rule action from Block to Disabled.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-39813: A path traversal vulnerability in Fortinet FortiSandbox allows remote, unauthenticated attackers to read arbitrary files from the underlying filesystem due to insufficient validation of user-supplied input paths.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="32075e19b1494117ac5915e8d84c92c9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d84c92c9</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Fortinet FortiSandbox - Path Traversal - CVE:CVE-2026-39813</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ae20608d93b94e97988db1bbc12cf9c8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c12cf9c8</span></button></rule-id></td><td>N/A</td><td>Anomaly:Header:User-Agent - Fake Bing or MSN Bot</td><td>Enabled</td><td>Disabled</td><td><p>We are changing the action for this rule from BLOCK to Disabled</p></td></tr></tbody></table>Wed, 01 Jul 2026 00:00:00 GMTWAFWAFGateway, Cloudflare One, Cloudflare Fundamentals - New permissions and roles for Gateway policies and listshttps://developers.cloudflare.com/changelog/post/2026-06-30-gateway-granular-permissions/https://developers.cloudflare.com/changelog/post/2026-06-30-gateway-granular-permissions/<p>You can now assign granular, resource-scoped roles for <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a> firewall policies and <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/lists/">Zero Trust lists</a>. Administrators can delegate access to specific policy types or list management without granting account-wide or product-wide control.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-new">What is new</h4><a class="anchor-link" href="#what-is-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you <a href="https://developers.cloudflare.com/fundamentals/manage-members/manage/">add a member</a> or create a <a href="https://developers.cloudflare.com/fundamentals/manage-members/policies/">permission policy</a>, the following resource-scoped roles are now available:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Role</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>Zero Trust Gateway Firewall Policies Admin</td> <td>Can view and edit all Gateway firewall policies, including DNS, HTTP, and Network policies.</td> </tr> <tr> <td>Zero Trust Gateway DNS Policies Admin</td> <td>Can view and edit Gateway DNS policies.</td> </tr> <tr> <td>Zero Trust Gateway HTTP Policies Admin</td> <td>Can view and edit Gateway HTTP policies.</td> </tr> <tr> <td>Zero Trust Gateway Network Policies Admin</td> <td>Can view and edit Gateway Network policies.</td> </tr> <tr> <td>Zero Trust Gateway Egress Policies Admin</td> <td>Can view and edit Gateway Egress policies.</td> </tr> <tr> <td>Zero Trust Gateway Resolver Policies Admin</td> <td>Can view and edit Gateway Resolver policies.</td> </tr> <tr> <td>Zero Trust Gateway Policies Admin</td> <td>Can view and edit all Gateway policies.</td> </tr> <tr> <td>Zero Trust Gateway Policies Read</td> <td>Can view all Gateway policies.</td> </tr> <tr> <td>Zero Trust Gateway Read Only</td> <td>Can view all Gateway resources.</td> </tr> <tr> <td>Zero Trust DNS Locations Admin</td> <td>Can view and edit DNS locations.</td> </tr> <tr> <td>Zero Trust Proxy Endpoints Admin</td> <td>Can view and edit Gateway Proxy Endpoints.</td> </tr> <tr> <td>Zero Trust Account Lists Admin</td> <td>Can view and edit all Gateway and Access lists.</td> </tr> <tr> <td>Zero Trust Account Lists Read</td> <td>Can view all Gateway and Access lists.</td> </tr> </tbody> </table></div> <p>These roles allow you to:</p> <ul> <li>Grant a network engineer write access to Network policies only, without exposing DNS or HTTP policy configuration.</li> <li>Allow a security analyst to view all Gateway policies in read-only mode for auditing purposes.</li> <li>Delegate list management to a team that maintains block and allow lists without giving them access to policy configuration.</li> </ul> <p>You can also now assign <em>Resource-scoped roles</em>. These roles are complementary to existing account-level roles, and allow you to grant access to a specific resource, like an individual Gateway policy or Cloudflare One list. <strong>Existing account-level roles continue to work.</strong> A member with the <code>Cloudflare Gateway</code> or <code>Cloudflare Zero Trust</code> role retains full access to all Gateway resources. This ensures backward compatibility for existing automation and API tokens.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Review the <a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles">resource-scoped roles</a> on the Cloudflare role reference.</li> <li>Learn how to <a href="https://developers.cloudflare.com/fundamentals/manage-members/policies/">create permission policies</a> that use these roles.</li> </ul>Tue, 30 Jun 2026 00:00:00 GMTGatewayGatewayCloudflare OneCloudflare FundamentalsLogs - Account-scoped firewall events dataset in Logpushhttps://developers.cloudflare.com/changelog/post/2026-06-30-account-level-firewall-events/https://developers.cloudflare.com/changelog/post/2026-06-30-account-level-firewall-events/<p>Cloudflare Logpush now supports <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/">firewall events as an account-scoped dataset</a>. Configure a single Logpush job at the account level to receive firewall events for every zone in the account, instead of creating and maintaining a separate job per zone.</p> <p>The dataset includes a new <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/#zonename"><code>ZoneName</code></a> field so you can identify which zone each event came from when consuming logs in your downstream pipeline.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-available">What's available</h4><a class="anchor-link" href="#whats-available"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>A new account-scoped <code>firewall_events</code> dataset, configurable via the <a href="https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/">Logpush API</a> or the Cloudflare dashboard.</li> <li>The same fields and filter expressions supported by the existing <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/firewall_events/">zone-scoped firewall events dataset</a>, plus the new <code>ZoneName</code> field.</li> <li>Support for all existing Logpush destinations.</li> </ul>Tue, 30 Jun 2026 00:00:00 GMTLogsLogsWorkers, Durable Objects - Track memory usage for Workers and Durable Objects in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-06-30-memory-usage-metrics/https://developers.cloudflare.com/changelog/post/2026-06-30-memory-usage-metrics/<p>You can now monitor how much memory your <a href="https://developers.cloudflare.com/workers/">Workers</a> and <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a> consume across invocations with the new <strong>Memory Usage</strong> chart in the Workers Metrics tab, broken down by P50, P90, P99, and P999 percentiles.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1210,height=782,format=webp/_astro/2026-06-26-memory-usage.B20y2uNp.png" alt="Memory usage chart showing P50, P90, P99, and P999 percentiles with deployment markers" loading="lazy" decoding="async" width="1210" height="782"> <p>Memory usage measures the V8 <a href="https://developers.cloudflare.com/workers/reference/how-workers-works/#isolates">isolate</a> memory at the time of each invocation, subject to the <a href="https://developers.cloudflare.com/workers/platform/limits/#memory">128 MB per-isolate limit</a> — a single isolate can handle many concurrent requests and shares memory across them.</p> <p>Use the Memory Usage chart to:</p> <ul> <li><strong>Track memory trends</strong> — Spot gradual increases that may indicate a memory leak before they cause <code>Exceeded Memory</code> errors.</li> <li><strong>Correlate with deployments</strong> — Deployment markers on the chart help you identify whether a new version introduced a memory regression.</li> <li><strong>Right-size your Worker</strong> — Understand your baseline memory footprint and how much headroom you have before hitting the 128 MB limit.</li> </ul> <p>For Durable Objects, memory usage reflects the in-memory state an object holds (class properties, caches, active WebSocket connections), which persists across invocations until the object is <a href="https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/">hibernated or evicted</a>. This state is not preserved across eviction, hibernation, or a crash, so persist anything important to <a href="https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/">storage</a>.</p> <p>To view memory usage, open the <strong>Metrics</strong> tab for your <a href="https://dash.cloudflare.com/?to=/:account/workers/services/view/:worker/production/metrics" target="_blank" rel="noopener">Worker<span class="external-link"> ↗</span></a> or <a href="https://dash.cloudflare.com/?to=/:account/workers/durable-objects" target="_blank" rel="noopener">Durable Object namespace<span class="external-link"> ↗</span></a>. For Durable Objects, you can filter by DO ID or name to drill down into memory usage for a specific object. You can also query memory usage programmatically via the <a href="https://developers.cloudflare.com/analytics/graphql-api/tutorials/querying-workers-metrics/">GraphQL Analytics API</a> using the <code>workersInvocationsAdaptive</code> dataset — the <code>quantiles.memoryUsageBytesP50</code> through <code>quantiles.memoryUsageBytesP999</code> fields return percentile values in bytes.</p> <p>For local memory debugging, you can also <a href="https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/">profile memory with DevTools</a> to take heap snapshots and identify specific objects causing high memory usage.</p>Tue, 30 Jun 2026 00:00:00 GMTWorkersWorkersDurable ObjectsCloudflare One Client - Cloudflare One Client for Windows (version 2026.6.822.0)https://developers.cloudflare.com/changelog/post/2026-06-29-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-06-29-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces multiple features from our previous beta release into stable release, including:</p> <ul> <li>The client now applies DNS search suffixes configured in your <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles">device profile</a> / <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies">network policy</a>. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search suffixes</a> for details.</li> <li>Added mandatory authentication. When enabled via MDM, the Cloudflare One Client blocks all Internet traffic from the moment the machine boots until the user authenticates, closing the visibility gap on newly deployed devices and during re-authentication. See the <a href="https://blog.cloudflare.com/mandatory-authentication-mfa/">announcement blog</a> and <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-no-auth-no-internet/">documentation</a> for details.</li> <li>Upgraded security of device registration to be hardware-backed. Registration tokens can now be generated in the TPM (with TPM 2.0+) whenever it is available to provide stronger protection against device impersonation. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/">Hardware-backed registration</a> for details.</li> <li>Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.</li> <li>Added new warp-cli debug commands for interactive connection diagnosis. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging">Extra debug logging</a> for details.</li> <li>The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.</li> <li>Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs">Cloudflare One MDM documentation</a> for details.</li> <li>Added support for dashboard-managed client version deployments. Administrators can now upgrade or downgrade the client version on enrolled devices directly from the Zero Trust dashboard. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/">Client version assignments</a> for details.</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Starting with 2026.6.822.0, the client unifies all API requests under the <code>api.devices.cloudflare.com</code> SNI, where previously both <code>zero-trust-client.cloudflareclient.com</code> and <code>notifications.cloudflareclient.com</code> were used. Review <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/">Cloudflare One Client with firewall</a> to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.</li> <li>Client Certificate device-posture checks now support template variables (e.g. <code>${serial_number}</code>, <code>${device_uuid}</code>) in the Subject Alternative Name field. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.</li> <li>Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in Windows Accessibility settings.</li> <li>Path MTU Discovery (PMTUD) is now enabled by default.</li> <li>The UseWebView2 registry value (HKLM\SOFTWARE\Cloudflare\CloudflareWARP\UseWebView2 = y) is once again honored by the new GUI for authentication, so administrators who prefer the embedded WebView2 browser for sign-in can opt back in. This setting was effectively ignored in the previous release; the default browser was always used. This key is now also honored for re-authentications.</li> <li>Fixed a crash in the authentication browser when navigating to a site that prompts for browser permissions (microphone, camera, notifications, etc.). The same fix had previously landed for the captive-portal browser; this extends it to the auth browser.</li> <li>Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.</li> <li>Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.</li> <li>Fixed a high CPU issue when the device wakes from sleep.</li> <li>Users can now register with team names in any case format without errors.</li> <li>New UI fixes<ul> <li>Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.</li> <li>Added a re-auth button and banner to the home screen so users don&#39;t miss it when their session expires.</li> <li>Added clear error messaging when the Cloudflare certificate needs to be installed.</li> <li>Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.</li> <li>New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.</li> <li>Added ability to configure proxy mode for consumer users.</li> <li>Added back the option to quit for consumer users.</li> </ul> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Single sign-on in the embedded WebView2 authentication browser may fail to use the Windows primary account, prompting for an interactive sign-in.</li> <li>An error indicating that Microsoft Edge can&#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.</li> <li>In rare cases, a registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Windows ARM may prompt the user to close running applications while trying to install this version. Simply click &quot;Ok&quot; with the default highlighted option.</li> </ul> Mon, 29 Jun 2026 20:05:45 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for macOS (version 2026.6.822.0)https://developers.cloudflare.com/changelog/post/2026-06-29-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-06-29-warp-macos-ga/<p>A new GA release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces multiple features from our previous beta release into stable release, including:</p> <ul> <li>The client now applies DNS search suffixes configured in your <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles">device profile</a> / <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies">network policy</a>. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search suffixes</a> for details.</li> <li>Upgraded security of device registration to be hardware-backed. Registration tokens can now be generated in the Secure Enclave whenever available to provide stronger protection against device impersonation. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/">Hardware-backed registration</a> for details.</li> <li>Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.</li> <li>Added new warp-cli debug commands for interactive connection diagnosis. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging">Extra debug logging</a> for details.</li> <li>The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.</li> <li>Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs">Cloudflare One MDM documentation</a> for details.</li> <li>Added support for dashboard-managed client version deployments. Administrators can now upgrade or downgrade the client version on enrolled devices directly from the Zero Trust dashboard. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/">Client version assignments</a> for details.</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Starting with 2026.6.822.0, the client unifies all API requests under the <code>api.devices.cloudflare.com</code> SNI, where previously both <code>zero-trust-client.cloudflareclient.com</code> and <code>notifications.cloudflareclient.com</code> were used. Review <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/">Cloudflare One Client with firewall</a> to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.</li> <li>Client Certificate device-posture checks now support template variables (e.g. <code>${serial_number}</code>, <code>${device_uuid}</code>) in the Subject Alternative Name field. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.</li> <li>Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the macOS Display settings.</li> <li>Path MTU Discovery (PMTUD) is now enabled by default.</li> <li>Fixed the in-client captive-portal browser rendering a blank &quot;Success&quot; page on some airline Wi-Fi networks. The browser now more consistently loads the airline&#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.</li> <li>Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.</li> <li>Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.</li> <li>Users can now register with team names in any case format without errors.</li> <li>New UI fixes<ul> <li>Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.</li> <li>Added a re-auth button and banner to the home screen so users don&#39;t miss it when their session expires.</li> <li>Added clear error messaging when the Cloudflare certificate needs to be installed.</li> <li>Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.</li> <li>New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.</li> <li>Added ability to configure proxy mode for consumer users.</li> <li>Added back the option to quit for consumer users.</li> </ul> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>When deploying with Microsoft Intune, the client may be repeatedly reinstalled because Intune adds the client&#39;s embedded framework bundles to its install-detection list, and those frameworks cannot be detected as installed on their own. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/known-limitations/#repeated-reinstalls-on-macos-with-microsoft-intune">Repeated reinstalls on macOS with Microsoft Intune</a> for the workaround.</li> </ul> Mon, 29 Jun 2026 20:05:45 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Linux (version 2026.6.822.0)https://developers.cloudflare.com/changelog/post/2026-06-29-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-06-29-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces multiple features from our previous beta release into stable release, including:</p> <ul> <li>The client now applies DNS search suffixes configured in your <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles">device profile</a> / <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies">network policy</a>. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search suffixes</a> for details.</li> <li>Upgraded security of device registration to be hardware-backed. Registration tokens can now be generated in the TPM (with TPM 2.0+) whenever it is available to provide stronger protection against device impersonation. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/">Hardware-backed registration</a> for details.</li> <li>Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.</li> <li>Added new warp-cli debug commands for interactive connection diagnosis. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging">Extra debug logging</a> for details.</li> <li>The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.</li> <li>Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs">Cloudflare One MDM documentation</a> for details.</li> </ul> <p><strong>Additional changes and improvements</strong></p> <ul> <li>Starting with 2026.6.822.0, the client unifies all API requests under the <code>api.devices.cloudflare.com</code> SNI, where previously both <code>zero-trust-client.cloudflareclient.com</code> and <code>notifications.cloudflareclient.com</code> were used. Review <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/">Cloudflare One Client with firewall</a> to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> functionality using the Cloudflare One Client is now supported on RHEL 9 and 10.</li> <li>Cloudflare Mesh now supports <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes">hostname-based routing</a>.</li> <li>Client Certificate device-posture checks now support template variables (e.g. <code>${serial_number}</code>, <code>${device_uuid}</code>) in the Subject Alternative Name field. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.</li> <li>Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the system display settings.</li> <li>Path MTU Discovery (PMTUD) is now enabled by default.</li> <li>Fixed the in-client captive-portal browser rendering a blank &quot;Success&quot; page on some airline Wi-Fi networks. The browser now more consistently loads the airline&#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.</li> <li>Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.</li> <li>Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.</li> <li>Fixed an issue where some Debian releases experienced inaccurate version reporting for posture checks.</li> <li>Users can now register with team names in any case format without errors.</li> <li>New UI fixes<ul> <li>Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.</li> <li>Added a re-auth button and banner to the home screen so users don&#39;t miss it when their session expires.</li> <li>Added clear error messaging when the Cloudflare certificate needs to be installed.</li> <li>Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.</li> <li>New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.</li> <li>Added ability to configure proxy mode for consumer users.</li> <li>Added back the option to quit for consumer users.</li> </ul> </li> </ul> <p>For RHEL deployments, this release introduces a dependency on the <a href="https://docs.fedoraproject.org/en-US/epel/">Extra Packages for Enterprise Linux</a> repository (EPEL). The EPEL repository provides packages that support the captive portal detection’s in-app browser authentication and system tray icon. See <a href="https://docs.fedoraproject.org/en-US/epel/getting-started/">Getting started with EPEL</a> for instructions on enabling EPEL.</p> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> </ul> Mon, 29 Jun 2026 19:21:09 GMTCloudflare One ClientCloudflare One ClientWorkers - Workers fetch requests now support cf.varyhttps://developers.cloudflare.com/changelog/post/2026-06-28-cf-vary-request-option/https://developers.cloudflare.com/changelog/post/2026-06-28-cf-vary-request-option/ <p>Workers <code>fetch()</code> requests now support the <code>cf.vary</code> request option. Use <code>cf.vary</code> to control how Cloudflare caches origin responses with a <code>Vary</code> header for a single subrequest.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cf: {</span></span> <span class="line"><span class="nb-shiki-140thh"> vary: {</span></span> <span class="line"><span class="nb-shiki-140thh"> default: { action: </span><span class="nb-shiki-mdbnqw">"bypass"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-140thh"> accept: {</span></span> <span class="line"><span class="nb-shiki-140thh"> action: </span><span class="nb-shiki-mdbnqw">"normalize"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> media_types: [</span><span class="nb-shiki-mdbnqw">"text/html"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"application/json"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "accept-language"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-140thh"> action: </span><span class="nb-shiki-mdbnqw">"normalize"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> languages: [</span><span class="nb-shiki-mdbnqw">"en"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"fr"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"de"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cf: {</span></span> <span class="line"><span class="nb-shiki-140thh"> vary: {</span></span> <span class="line"><span class="nb-shiki-140thh"> default: { action: </span><span class="nb-shiki-mdbnqw">"bypass"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-140thh"> accept: {</span></span> <span class="line"><span class="nb-shiki-140thh"> action: </span><span class="nb-shiki-mdbnqw">"normalize"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> media_types: [</span><span class="nb-shiki-mdbnqw">"text/html"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"application/json"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "accept-language"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-140thh"> action: </span><span class="nb-shiki-mdbnqw">"normalize"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> languages: [</span><span class="nb-shiki-mdbnqw">"en"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"fr"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"de"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#the-cfvary-property"><code>cf.vary</code></a>.</p>Sun, 28 Jun 2026 00:00:00 GMTWorkersWorkersAgents, Workers - Agents SDK adds background sub-agents and a unified turn entry pointhttps://developers.cloudflare.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/https://developers.cloudflare.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> makes it easier to run long work in the background, drive turns through one entry point, and keep chat agents working through deploys, evictions, and reconnects.</p> <p>This release adds first-class detached (background) sub-agent runs with live progress and durable milestones, a single <code>runTurn</code> turn-admission entry point, and a large round of recovery and reliability fixes that continue converging <code>@cloudflare/think</code> and <code>@cloudflare/ai-chat</code> onto one model.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="background-sub-agents-with-progress-and-milestones">Background sub-agents with progress and milestones</h4><a class="anchor-link" href="#background-sub-agents-with-progress-and-milestones"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>runAgentTool</code> can now dispatch a sub-agent without blocking the calling turn. A detached run returns a handle immediately and is owned by a durable, eviction-surviving backbone instead of being abandoned when the dispatching turn ends.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> OrdersAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> startImport</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">input</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Fire-and-forget, or wire a durable completion callback</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // (by method name, like schedule()):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runAgentTool</span><span class="nb-shiki-140thh">(ImportAgent, {</span></span> <span class="line"><span class="nb-shiki-140thh"> input,</span></span> <span class="line"><span class="nb-shiki-140thh"> detached: { onFinish: </span><span class="nb-shiki-mdbnqw">"onImportDone"</span><span class="nb-shiki-140thh">, maxBudgetMs: </span><span class="nb-shiki-dzsirb">60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // result.status: "completed" | "error" | "aborted" | "interrupted"</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onImportDone</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">run</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">result</span><span class="nb-shiki-140thh">) {}</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> OrdersAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> startImport</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">input</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Fire-and-forget, or wire a durable completion callback</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // (by method name, like schedule()):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runAgentTool</span><span class="nb-shiki-140thh">(ImportAgent, {</span></span> <span class="line"><span class="nb-shiki-140thh"> input,</span></span> <span class="line"><span class="nb-shiki-140thh"> detached: { onFinish: </span><span class="nb-shiki-mdbnqw">"onImportDone"</span><span class="nb-shiki-140thh">, maxBudgetMs: </span><span class="nb-shiki-dzsirb">60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // result.status: "completed" | "error" | "aborted" | "interrupted"</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onImportDone</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">run</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">result</span><span class="nb-shiki-140thh">) {}</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Highlights:</p> <ul> <li><strong>Durable, exactly-once-on-the-happy-path completion</strong> via a warm fast path plus a self-scheduling reconcile backbone that survives eviction and deploys.</li> <li><strong>Bounded.</strong> An absolute <code>maxBudgetMs</code> ceiling (default 24h) and <code>cancelAgentTool(runId)</code> keep abandoned runs from holding a concurrency slot forever.</li> <li><strong><code>detached: { notify: true }</code></strong> lets a finished background run inject a message back into the chat so the model reacts to the result — no hand-wired <code>onFinish</code> needed.</li> </ul> <p>Sub-agents can also report mid-run progress that rides their own turn stream back to the parent's connected clients:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Inside the child sub-agent:</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">reportProgress</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> fraction: </span><span class="nb-shiki-dzsirb">0.6</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> phase: </span><span class="nb-shiki-mdbnqw">"deploying"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> message: </span><span class="nb-shiki-mdbnqw">"Generating menu page…"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Inside the child sub-agent:</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">reportProgress</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> fraction: </span><span class="nb-shiki-dzsirb">0.6</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> phase: </span><span class="nb-shiki-mdbnqw">"deploying"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> message: </span><span class="nb-shiki-mdbnqw">"Generating menu page…"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Progress surfaces on <code>AgentToolRunState.progress</code> via <code>useAgentToolEvents</code>, so a background-runs tray can render a live bar without drilling in, and the latest snapshot is persisted for inspection after eviction. Naming a <code>milestone</code> promotes a signal to a durable, replayable row, and <code>detached: { onMilestones }</code> can surface a milestone as a synthetic chat message (<code>"narrate"</code> for a cheap status line, or <code>"react"</code> to drive a model turn).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="one-entry-point-for-turns-runturn">One entry point for turns: <code>runTurn</code></h4><a class="anchor-link" href="#one-entry-point-for-turns-runturn"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/think</code> adds a public <code>runTurn(options)</code> facade that unifies turn admission behind a single <code>mode</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"wait"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// saveMessages / continueLastTurn</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"submit"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// durable submitMessages</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"stream"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// chat()</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"wait"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// saveMessages / continueLastTurn</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"submit"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// durable submitMessages</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runTurn</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"stream"</span><span class="nb-shiki-140thh">, messages }); </span><span class="nb-shiki-21nrsd">// chat()</span></span></code></pre></figure></div></div></div></div> <p><code>stream</code> mode accepts array and function inputs to match <code>wait</code> mode, and all entry points now route through a shared internal admission path that throws a clear error on nested blocking admissions that previously could deadlock.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="recovery-and-reliability">Recovery and reliability</h4><a class="anchor-link" href="#recovery-and-reliability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A large part of this release continues hardening recovery and converging <code>@cloudflare/think</code> and <code>@cloudflare/ai-chat</code> onto one model:</p> <ul> <li><strong>Stream stall watchdog.</strong> <code>AIChatAgent</code> can detect and recover from a hung model/transport stream via the opt-in <code>chatStreamStallTimeoutMs</code> watchdog. With <code>chatRecovery</code> enabled the stall routes into the same bounded-recovery machinery a deploy or eviction uses; otherwise it surfaces as a terminal stream error so the spinner clears.</li> <li><strong>Interrupted tool-call repair.</strong> <code>AIChatAgent</code> now repairs a transcript with a dead server-tool call before re-entering inference (parity with <code>@cloudflare/think</code>), so a recovered turn no longer fails with <code>AI_MissingToolResultsError</code>. An overridable <code>repairInterruptedToolPart(part)</code> hook lets apps customize the repaired shape.</li> <li><strong>Stuck status after reconnect.</strong> Fixed AI SDK <code>status</code> getting stuck when a reconnect races a turn that has been accepted but has not started streaming yet, so the UI now renders the in-flight turn instead of settling on <code>ready</code>.</li> <li><strong>Live "recovering…" on connect.</strong> <code>AIChatAgent</code> now replays the recovering status to a client that connects mid-recovery, so <code>useAgentChat</code>'s <code>isRecovering</code> reflects in-progress recovery immediately instead of appearing frozen.</li> <li><strong>Terminal connection failures.</strong> The client stops reconnecting on terminal WebSocket close events and exposes them via <code>connectionError</code> / <code>onConnectionError</code> on <code>AgentClient</code>, <code>useAgent</code>, and <code>useAgentChat</code>.</li> <li><strong>Agent-tool child recovery.</strong> A healthy long-running sub-agent run is no longer abandoned as <code>interrupted</code> after a deploy (both <code>@cloudflare/think</code> and <code>AIChatAgent</code>).</li> <li><strong>Workflows from sub-agent facets.</strong> Agent Workflows can now start from sub-agent facets, with callbacks and Workflow RPC routed back to the originating facet.</li> <li>Plus forward-progress crediting convergence, broadcast-first give-up ordering, an event-driven auto-continuation barrier, and structured row-size compaction in <code>AIChatAgent</code>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Shared chat React core.</strong> A new <code>agents/chat/react</code> entry exposes <code>useAgentChat</code>, transport helpers, and shared wire types, with <code>syncMessagesToServer</code> for server-authoritative transcript storage. <code>@cloudflare/think/react</code> and <code>@cloudflare/ai-chat/react</code> are now thin wrappers over it.</li> <li><strong>Optional <code>ai</code> peer.</strong> The root <code>agents</code> and <code>@cloudflare/codemode</code> runtimes no longer reference AI SDK types, so they bundle without <code>ai</code> / <code>zod</code> installed; AI-specific entry points still require the peer when imported. <code>just-bash</code> likewise moves to an optional peer used only by the skills bash runner.</li> <li><strong>Code Mode.</strong> The default <code>DynamicWorkerExecutor</code> timeout increases from 30s to 60s, executions now dispose the dynamically-loaded Worker and its RPC stub after each run (fixing a flaky isolate-shutdown assertion), connector imports are cleaned up, and the outer MCP tool-call context is passed to <code>openApiMcpServer</code> request callbacks.</li> <li><strong>Voice.</strong> Voice turns now support AI SDK <code>fullStream</code> responses (and warn when <code>textStream</code> is used).</li> <li><strong>MCP.</strong> <code>McpAgent</code> server-to-client requests can now be sent from callbacks that do not inherit the agent's async context, including callbacks reached through Worker Loader RPC.</li> <li><strong>Experimental: server actions and channels.</strong> This release lays groundwork for guarded server actions (<code>action()</code> / <code>getActions()</code> with a durable replay ledger and approvals) and a unified channels surface (<code>configureChannels()</code>, <code>deliverNotice()</code>). Both are experimental and their APIs may change, so we don't recommend depending on them yet.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-npm" id="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-yarn" id="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-pnpm" id="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-bun" id="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-npm" aria-labelledby="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-yarn" aria-labelledby="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-pnpm" aria-labelledby="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-bun" aria-labelledby="pm-tab-pm-5b8d35cd-8de7-4410-b507-7e497414e3b5-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Refer to the <a href="https://developers.cloudflare.com/agents/harnesses/think/">Think documentation</a>, <a href="https://developers.cloudflare.com/agents/tools/codemode/">Code Mode documentation</a>, and <a href="https://developers.cloudflare.com/agents/">Agents documentation</a> for more information.</p>Fri, 26 Jun 2026 00:00:00 GMTAgentsAgentsWorkersCloudflare One, Access - Service token support for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-06-26-mcp-portal-service-tokens/https://developers.cloudflare.com/changelog/post/2026-06-26-mcp-portal-service-tokens/<p>You can now connect autonomous agents and bots to an <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portal</a> using an <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/">Access service token</a>. Service token sessions can reach upstream MCP servers through the portal without a browser-based OAuth flow.</p> <p>To set this up:</p> <ul> <li>Add a <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#service-auth">Service Auth policy</a> that matches your service token to the portal's Access application.</li> <li>Add a Service Auth policy that matches the same token to each linked MCP server's Access application.</li> <li>Turn <strong>Require user auth</strong> off (<code>on_behalf: false</code>) for each linked server so the portal uses the admin credential instead of a per-user OAuth grant.</li> </ul> <p>The bot connects with <code>CF-Access-Client-Id</code> and <code>CF-Access-Client-Secret</code> headers and sees the tools from every linked server it is authorized for. Servers that still require per-user OAuth are excluded from service token sessions because a service token cannot complete a per-user OAuth grant.</p> <p>For step-by-step setup, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#connect-with-a-service-token">Connect with a service token</a>.</p>Fri, 26 Jun 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessDurable Objects, Workers - New `us` jurisdiction for Durable Objectshttps://developers.cloudflare.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/https://developers.cloudflare.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/<p>Durable Objects now supports a <code>us</code> <a href="https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction">jurisdiction</a>, letting you create Durable Objects that only run and store data within the United States. Use the <code>us</code> jurisdiction when you need to keep a Durable Object's compute and storage inside the United States to meet data residency requirements.</p> <p>Create a namespace restricted to the <code>us</code> jurisdiction the same way as any other jurisdiction:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Worker</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> usSubnamespace</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">jurisdiction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"us"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> usSubnamespace.</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"general"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Workers may still access Durable Objects constrained to the <code>us</code> jurisdiction from anywhere in the world. The jurisdiction constraint only controls where the Durable Object itself runs and persists data.</p> <p>For the full list of supported jurisdictions, refer to <a href="https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction">Data location — Restrict Durable Objects to a jurisdiction</a>.</p>Fri, 26 Jun 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersCloudflare Fundamentals - Search API tokens by namehttps://developers.cloudflare.com/changelog/post/2026-06-25-api-token-search/https://developers.cloudflare.com/changelog/post/2026-06-25-api-token-search/<p>You can now search API tokens by name, making it easier to find specific tokens across large token lists without manually paginating.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Dashboard search</strong>: Both <a href="https://dash.cloudflare.com/?to=/:account/account-api-tokens" target="_blank" rel="noopener">account API tokens<span class="external-link"> ↗</span></a> and <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank" rel="noopener">user API tokens<span class="external-link"> ↗</span></a> pages now include a search bar. Type a name to filter results.</li> <li><strong>API search support</strong>: The <a href="https://developers.cloudflare.com/api/resources/user/subresources/tokens/methods/list/"><code>/user/tokens</code></a> and <a href="https://developers.cloudflare.com/api/resources/accounts/subresources/tokens/methods/list/"><code>/accounts/{account_id}/tokens</code></a> endpoints now accept a <code>name</code> query parameter to filter tokens by name.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">Create an API token</a> and <a href="https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/">Account API tokens</a>.</p>Thu, 25 Jun 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsDurable Objects, Workers - Test Durable Object eviction with new cloudflare:test helpershttps://developers.cloudflare.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/https://developers.cloudflare.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/<p>The <code>@cloudflare/vitest-pool-workers</code> package now includes <code>evictDurableObject</code> and <code>evictAllDurableObjects</code> test helpers, exported from <code>cloudflare:test</code>.</p> <p>These helpers let you test how a Durable Object behaves across evictions, simulating the production lifecycle where an idle Durable Object can be evicted from memory.</p> <p>For more context, refer to <a href="https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/">Lifecycle of a Durable Object</a>.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { evictDurableObject, evictAllDurableObjects } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:test"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">COUNTER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">idFromName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-counter"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">COUNTER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(id);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Evict the Durable Object instance pointed to by a specific stub</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> evictDurableObject</span><span class="nb-shiki-140thh">(stub);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Close WebSockets instead of hibernating them</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> evictDurableObject</span><span class="nb-shiki-140thh">(stub, { webSockets: </span><span class="nb-shiki-mdbnqw">"close"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Evict all currently-running Durable Objects in evictable namespaces</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> evictAllDurableObjects</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <p>These helpers are available in <code>@cloudflare/vitest-pool-workers@0.16.20</code> and later.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/workers/testing/vitest-integration/test-apis/#durable-objects">Test APIs reference</a> and the <a href="https://developers.cloudflare.com/durable-objects/examples/testing-with-durable-objects/#testing-eviction">Testing Durable Objects guide</a>.</p>Thu, 25 Jun 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersCloudflare One Client - Cloudflare One Client for macOS (version 2026.6.782.1)https://developers.cloudflare.com/changelog/post/2026-06-24-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2026-06-24-warp-macos-beta/<p>A new Beta release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This beta release introduces upgraded security of device registration to be hardware-backed. Registration tokens can now be generated in the Secure Enclave whenever available to provide stronger protection against device impersonation.</p> <p><strong>Additional changes and improvements</strong></p> <p>This release also introduces multiple fixes and improvements including:</p> <ul> <li>Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the macOS Display settings.</li> <li>Path MTU Discovery (PMTUD) is now enabled by default.</li> <li>Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.</li> <li>Users can now register with team names in any case format without errors.</li> <li>New UI fixes<ul> <li>Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.</li> <li>Added a re-auth button and banner to the home screen so users don&#39;t miss it when their session expires.</li> <li>Added clear error messaging when the Cloudflare certificate needs to be installed.</li> <li>Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.</li> <li>New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.</li> <li>Added ability to configure proxy mode for consumer users.</li> <li>Added back the option to quit for consumer users.</li> </ul> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> </ul> Wed, 24 Jun 2026 18:35:32 GMTCloudflare One ClientCloudflare One ClientAI Search - Control AI Search similarity cache freshnesshttps://developers.cloudflare.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/https://developers.cloudflare.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now gives you more control over <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/cache/">similarity cache</a> freshness. Similarity cache helps reduce latency and inference cost by reusing responses for semantically similar queries.</p> <p>With these updates, you can choose how long responses are eligible for reuse and clear cached responses when they may be stale.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cache-duration-now-defaults-to-48-hours">Cache duration now defaults to 48 hours</h4><a class="anchor-link" href="#cache-duration-now-defaults-to-48-hours"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously, AI Search cached responses for a fixed duration of 30 days. Cached responses now use the instance's <code>cache_ttl</code> setting, and the default is <strong>48 hours</strong>.</p> <p>You can set <code>cache_ttl</code> when creating or updating an instance to choose a cache duration from 10 minutes to 6 days.</p> <p>Use a shorter TTL when your source content changes frequently and freshness is more important. Use a longer TTL when your content is stable and you want more cache reuse.</p> <p>For example, set <code>cache_ttl</code> to <code>518400</code> to retain cached responses for 6 days:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cache_ttl"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">518400</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="purge-cached-responses">Purge cached responses</h4><a class="anchor-link" href="#purge-cached-responses"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can also purge all cached responses for an instance on demand. Purging cached responses does not delete indexed content or source files.</p> <p>It prevents AI Search from reusing previous cached responses, so subsequent similar queries generate fresh answers and repopulate the cache.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/ai-search/instances/</span><span class="nb-shiki-140thh">$INSTANCE_NAME</span><span class="nb-shiki-mdbnqw">/purge_cache"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <p>You can also purge cached responses from the instance settings page in the Cloudflare dashboard.</p> <p>Refer to <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/cache/">similarity cache</a> for the full list of supported <code>cache_ttl</code> values and more details about cache behavior.</p>Wed, 24 Jun 2026 00:00:00 GMTAI SearchAI SearchAudit Logs - Audit Logs v2 — Organization-level audit logs in Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-06-24-audit-logs-v2-organization-dashboard-ui/https://developers.cloudflare.com/changelog/post/2026-06-24-audit-logs-v2-organization-dashboard-ui/<p>You can now, as an <a href="https://developers.cloudflare.com/fundamentals/organizations/">Organization</a> Super Administrator, view organization-level <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">audit logs</a> in the Cloudflare dashboard, in addition to the existing <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/#organization-activity-logs">API access</a>.</p> <p>Organization audit logs help you monitor activity across your organization. You can see who performed an action, what changed, when it happened, how it was performed, and whether it succeeded or failed.</p> <p>You can filter and search logs by actor, action, result, resource, request details, and timestamp. Use these logs to troubleshoot changes, investigate unexpected access, and support security or compliance workflows.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3450,height=1738,format=webp/_astro/Audit_logs_v2_organization_dashboard.De-uwPva.png" alt="Organization audit logs in the Cloudflare dashboard" loading="lazy" decoding="async" width="3450" height="1738"> <p>If you are viewing account-level audit logs and the account belongs to an organization where you are an Organization Super Administrator, select <strong>View Organization Audit Logs</strong> to open the parent organization's audit logs.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3456,height=510,format=webp/_astro/Audit_logs_v2_view_organization_button.Ch7CaBB-.png" alt="View Organization Audit Logs button" loading="lazy" decoding="async" width="3456" height="510"> <p>To get started, go to <strong>Organizations</strong>, select your organization, then go to <strong>Manage Organization</strong> &gt; <strong>Audit Logs</strong>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs documentation</a>.</p>Wed, 24 Jun 2026 00:00:00 GMTAudit LogsAudit LogsLogs - New WebSocket Analytics Logpush dataset and updated fieldshttps://developers.cloudflare.com/changelog/post/2026-06-24-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-06-24-log-fields-updated/<p>Cloudflare has updated <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-datasets">New datasets</h4><a class="anchor-link" href="#new-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>WebSocket Analytics</strong>: A new dataset with fields including <code>BytesReceivedClient</code>, <code>BytesReceivedOrigin</code>, <code>BytesSentClient</code>, <code>BytesSentOrigin</code>, <code>ClientASN</code>, <code>ClientIP</code>, <code>ClientRequestHost</code>, <code>ClientRequestPath</code>, <code>ClientRequestUserAgent</code>, <code>ColoCode</code>, <code>ConnectionCloseReason</code>, <code>ConnectionCloseSource</code>, <code>ConnectionID</code>, <code>ConnectionTransportCloseCode</code>, <code>EdgeEndTimestamp</code>, <code>EdgeStartTimestamp</code>, and <code>RayID</code>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updated-fields-in-existing-datasets">Updated fields in existing datasets</h4><a class="anchor-link" href="#updated-fields-in-existing-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Firewall events</strong> (added): <code>ZoneName</code>. The Firewall events dataset is now also available for <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/">account-scope Logpush</a>, in addition to the existing zone scope.</li> <li><strong>Email Security Alerts</strong> (added): <code>BCC</code>, <code>DKIMResult</code>, <code>DMARCPolicy</code>, <code>DMARCResult</code>, and <code>SPFResult</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Wed, 24 Jun 2026 00:00:00 GMTLogsLogsRadar - Precise IP location and richer AS details on the Cloudflare Radar IP pagehttps://developers.cloudflare.com/changelog/post/2026-06-24-radar-ip-page-improvements/https://developers.cloudflare.com/changelog/post/2026-06-24-radar-ip-page-improvements/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now plots your IPv4 and IPv6 locations on the <a href="https://radar.cloudflare.com/ip" target="_blank" rel="noopener">IP page<span class="external-link"> ↗</span></a>, shows the Cloudflare data centers serving your connection, and includes more detail about the autonomous system (AS) your primary IP belongs to.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="your-ip-location-on-the-map">Your IP location on the map</h4><a class="anchor-link" href="#your-ip-location-on-the-map"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The map of your connection now shows:</p> <ul> <li><strong>IP location markers</strong> — The primary IP will show as a red marker. When both IP addresses do not geolocate to the same place, a second marker will appear in blue with a note explaining why IPv4 and IPv6 can resolve to different locations.</li> <li><strong>Cloudflare data center markers</strong> — Cloudflare data centers now show as orange dots on the map and the one you are connected to is highlighted.</li> <li><strong>Data center connectors</strong> — Each line connects your IP markers to their respective data centers.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3136,height=1305,format=webp/_astro/ip-page-geolocation.BJ53oUtj.png" alt="Map showing Cloudflare data centers and a marker representing the IP location with a line connected to a data center" loading="lazy" decoding="async" width="3136" height="1305"> <p>Due to the data policies of our geolocation provider, this detailed location is only available for your own IP. Other IP addresses keep the current country-level view.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="extended-as-information">Extended AS information</h4><a class="anchor-link" href="#extended-as-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The AS card on the IP page now shows additional detail about the network an IP belongs to — including alternate names, the operator website, and an estimate of the AS user population — alongside the AS number and country.</p> <p>Visit the <a href="https://radar.cloudflare.com/ip" target="_blank" rel="noopener">Cloudflare Radar IP page<span class="external-link"> ↗</span></a> to explore more details about your IP.</p>Wed, 24 Jun 2026 00:00:00 GMTRadarRadarWorkflows - Workflows rollback handlers now include step contexthttps://developers.cloudflare.com/changelog/post/2026-06-16-rollback-options/https://developers.cloudflare.com/changelog/post/2026-06-16-rollback-options/<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> makes it easier to build reliable multi-step applications that can recover when downstream systems fail. Rollback handlers now receive the original <a href="https://developers.cloudflare.com/workflows/build/step-context/">step context</a> via a <code>ctx</code> object for the step being rolled back. This includes <code>ctx.step.name</code>, <code>ctx.step.count</code>, <code>ctx.attempt</code>, and the step <code>config</code> with defaults applied.</p> <p>The <a href="https://developers.cloudflare.com/workflows/build/workers-api/#workflowstepconfig">step configuration</a> includes the retry and timeout settings used for that step, so you can customize your step recovery logic according to those fields.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "create charge"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> charge</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> createCharge</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { chargeId: charge.id };</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> rollback</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">output</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // `output` is the value returned by the step being rolled back.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">chargeId</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> output </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-1jdh33">chargeId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> refundCharge</span><span class="nb-shiki-140thh">(chargeId, {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // `ctx` is the original step context, including step name, count, attempt, and config.</span></span> <span class="line"><span class="nb-shiki-140thh"> reason: </span><span class="nb-shiki-mdbnqw">`${</span><span class="nb-shiki-140thh">ctx</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">step</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}: ${</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> rollbackConfig: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // `rollbackConfig` controls retries and timeout for the rollback handler.</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: { limit: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">, delay: </span><span class="nb-shiki-mdbnqw">"30 seconds"</span><span class="nb-shiki-140thh">, backoff: </span><span class="nb-shiki-mdbnqw">"linear"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"5 minutes"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/workflows/build/workers-api/#rollback-options">rollback options</a> to learn more.</p>Tue, 23 Jun 2026 12:00:00 GMTWorkflowsWorkflowsData Localization Suite - Regionalized IP Bindings for Regional Serviceshttps://developers.cloudflare.com/changelog/post/2026-06-23-regionalized-ip-bindings/https://developers.cloudflare.com/changelog/post/2026-06-23-regionalized-ip-bindings/<p>Regional Services now supports <strong>Regionalized IP Bindings</strong>, letting you regionalize traffic at the IP layer for prefixes you bring to Cloudflare through <a href="https://developers.cloudflare.com/byoip/">Bring Your Own IP (BYOIP)</a>.</p> <p>Where <a href="https://developers.cloudflare.com/data-localization/regional-services/regional-hostnames/">Regional Hostnames</a> regionalize traffic by hostname, Regionalized IP Bindings let you bind a CIDR from one of your prefixes to a region — ideal for address-map deployments and any service you address by IP rather than hostname. Cloudflare then terminates TLS and processes traffic to those addresses only within the data centers in that region.</p> <p>Regionalized IP Bindings requires the Regional Services and Regional Services for BYOIP entitlements. Contact your account team to enable them.</p> <p>To get started, refer to <a href="https://developers.cloudflare.com/data-localization/regional-services/ip-bindings/">Regionalized IP Bindings</a>.</p>Tue, 23 Jun 2026 00:00:00 GMTData Localization SuiteData Localization SuiteSpeed - Cloudflare AMP/SXG is now end of life.https://developers.cloudflare.com/changelog/post/2026-06-23-amp-sxg-end-of-life/https://developers.cloudflare.com/changelog/post/2026-06-23-amp-sxg-end-of-life/<p>Cloudflare Accelerated Mobile Pages (AMP) and Signed Exchanges (SXG) support has reached end of life. The features have been disabled since October 2025, so customers who had them configured should see no change to their traffic.</p> <p>Customers will no longer be able to configure AMP/SXG through API or rulesets. The Zone API will start throwing errors. Rulesets with the SXG configuration will fail to save until SXG has been removed.</p>Tue, 23 Jun 2026 00:00:00 GMTSpeedSpeedWAF - WAF Release - 2026-06-23https://developers.cloudflare.com/changelog/post/2026-06-23-waf-release/https://developers.cloudflare.com/changelog/post/2026-06-23-waf-release/ <p>This week's release introduces new managed protection to address a critical pre-authentication OS command injection vulnerability in Ivanti Sentry (CVE-2026-10520).</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-10520: An OS command injection vulnerability in Ivanti Sentry allows remote, unauthenticated attackers to execute arbitrary system commands with root privileges. The flaw stems from improper sanitization of input strings parsed during internal configuration handling.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="500a90789f874345b60b0de7242fdf83"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...242fdf83</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Ivanti Sentry - Command Injection - CVE:CVE-2026-10520</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr></tbody></table>Tue, 23 Jun 2026 00:00:00 GMTWAFWAFR2 SQL - R2 SQL now supports window functions, DISTINCT, and set operationshttps://developers.cloudflare.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/https://developers.cloudflare.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/<p>R2 SQL now supports window functions, <code>SELECT DISTINCT</code>, set operations, and additional aggregates, making it easier to write analytical queries without preprocessing your data elsewhere.</p> <p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> is Cloudflare's serverless, distributed SQL engine for querying <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-capabilities">New capabilities</h4><a class="anchor-link" href="#new-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Window functions</strong> — <code>ROW_NUMBER</code>, <code>RANK</code>, <code>DENSE_RANK</code>, <code>PERCENT_RANK</code>, <code>CUME_DIST</code>, <code>NTILE</code>, <code>LAG</code>, <code>LEAD</code>, <code>FIRST_VALUE</code>, <code>LAST_VALUE</code>, <code>NTH_VALUE</code>, and aggregates with an <code>OVER (...)</code> clause, including <code>PARTITION BY</code> and explicit frames</li> <li><strong>QUALIFY</strong> — filter rows based on a window function result</li> <li><strong>DISTINCT</strong> — <code>SELECT DISTINCT</code>, <code>DISTINCT ON (...)</code>, and the <code>DISTINCT</code> modifier on aggregates such as <code>COUNT(DISTINCT ...)</code></li> <li><strong>Set operations</strong> — <code>UNION</code>, <code>UNION ALL</code>, <code>INTERSECT</code>, and <code>EXCEPT</code></li> <li><strong>Grouping extensions</strong> — <code>GROUPING SETS</code>, <code>ROLLUP</code>, and <code>CUBE</code></li> <li><strong>Exact aggregates</strong> — <code>MEDIAN</code>, <code>PERCENTILE_CONT</code>, <code>ARRAY_AGG</code>, and <code>STRING_AGG</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rank-rows-with-a-window-function">Rank rows with a window function</h4><a class="anchor-link" href="#rank-rows-with-a-window-function"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> customer_id, region,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> ROW_NUMBER</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">OVER</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">PARTITION</span><span class="nb-shiki-1itgoe"> BY</span><span class="nb-shiki-140thh"> region </span><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-140thh"> total_amount </span><span class="nb-shiki-1itgoe">DESC</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> rank_in_region</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="filter-with-qualify">Filter with QUALIFY</h4><a class="anchor-link" href="#filter-with-qualify"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> customer_id, region, total_amount</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-140thh">QUALIFY </span><span class="nb-shiki-dzsirb">ROW_NUMBER</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">OVER</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">PARTITION</span><span class="nb-shiki-1itgoe"> BY</span><span class="nb-shiki-140thh"> region </span><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-140thh"> total_amount </span><span class="nb-shiki-1itgoe">DESC</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">&lt;=</span><span class="nb-shiki-dzsirb"> 3</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="combine-tables-with-a-set-operation">Combine tables with a set operation</h4><a class="anchor-link" href="#combine-tables-with-a-set-operation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> customer_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">EXCEPT</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> customer_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">archived_sales</span></span></code></pre></figure> <p>The named <code>WINDOW</code> clause is not supported — inline the <code>OVER (...)</code> specification at each call site. For the full syntax reference, refer to the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. For supported features and performance guidance, refer to <a href="https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/">Limitations and best practices</a>.</p>Mon, 22 Jun 2026 00:00:00 GMTR2 SQLR2 SQLCloudflare Mesh, Cloudflare Tunnel, Cloudflare WAN, Cloudflare One - Manage all your routes from one page in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-06-19-unified-routes-page/https://developers.cloudflare.com/changelog/post/2026-06-19-unified-routes-page/ <p>The <strong>Routes</strong> page in the Cloudflare dashboard now shows the routes across all of your connectors — <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> and <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a> routes alongside <a href="https://developers.cloudflare.com/cloudflare-wan/">Cloudflare WAN</a> and <a href="https://developers.cloudflare.com/magic-transit/">Magic Transit</a> static routes — in a single table, instead of a separate routes view per product.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=948,format=webp/_astro/2026-06-19-unified-routes.B3igBY20.gif" alt="The unified Routes page in the Cloudflare dashboard, showing routes across connectors in a single table" loading="lazy" decoding="async" width="1800" height="948"> <p>From the unified Routes page you can:</p> <ul> <li><strong>Visualize your network with an interactive map</strong> that shows how your destinations flow through to your connectors — including equal-cost multi-path (ECMP) routes where the same prefix is served by several connectors. Select a node to filter the table down to the routes behind it.</li> <li><strong>See every route in one table</strong>, with its destination, type, connector, priority, and source, and filter or sort to find what you need.</li> <li><strong>Create, edit, and delete routes</strong> of any supported type without leaving the page. When adding a Cloudflare WAN or Magic Transit static route, you now pick the next hop by <strong>connector name</strong> instead of typing its IP.</li> <li><strong>Manage <a href="https://developers.cloudflare.com/cloudflare-one/networks/virtual-networks/">virtual networks</a></strong> from a dedicated tab.</li> <li><strong>Test a route</strong> to see which connector and next hop a destination resolves to before you commit a change.</li> </ul> <p>To find it, go to <strong>Networking</strong> &gt; <strong>Routes</strong> in the dashboard sidebar.</p> <a href="https://dash.cloudflare.com/?to=/:account/magic-networks/routes" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Routes</strong>&nbsp;&#8599;</a> <p>Your existing routes, APIs, and configurations are unchanged — this is a dashboard experience that brings them together in one place. Learn how to <a href="https://developers.cloudflare.com/cloudflare-one/networks/routes/add-routes/">add routes</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/virtual-networks/">manage virtual networks</a>.</p>Fri, 19 Jun 2026 00:00:00 GMTCloudflare MeshCloudflare MeshCloudflare TunnelCloudflare WANCloudflare OneDurable Objects, Workers - New Asia-Pacific location hints: apac-ne and apac-sehttps://developers.cloudflare.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/https://developers.cloudflare.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/<p>Durable Objects now supports two new location hints for Asia-Pacific: <code>apac-ne</code> (Northeast Asia-Pacific) and <code>apac-se</code> (Southeast Asia-Pacific). Use <code>apac-ne</code> or <code>apac-se</code> when you want finer-grained placement within Asia-Pacific rather than the broader <code>apac</code> hint.</p> <p>Use the new hints the same way as any other <code>locationHint</code>:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Northeast Asia-Pacific (Japan, Korea, etc.)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stubNE</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(id, { locationHint: </span><span class="nb-shiki-mdbnqw">"apac-ne"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Southeast Asia-Pacific (Singapore, Indonesia, etc.)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stubSE</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(id, { locationHint: </span><span class="nb-shiki-mdbnqw">"apac-se"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure> <p>If your users are spread across all of Asia-Pacific, the existing <code>apac</code> hint remains the right choice. Only reach for <code>apac-ne</code> or <code>apac-se</code> when your traffic is clearly concentrated in one sub-region and you want to minimize round-trip time to that audience. The default behavior and what we generally recommended is not adding a location hint unless absolutely needed, this will create the Durable Object as close to the initializing request as possible to reduce latency.</p> <p>As with all location hints, these are best-effort suggestions. Cloudflare will place the Durable Object in a nearby data center, not necessarily the exact hinted location.</p> <p>For the full list of supported hints, refer to <a href="https://developers.cloudflare.com/durable-objects/reference/data-location/#provide-a-location-hint">Data location — Provide a location hint</a>.</p>Fri, 19 Jun 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersDurable Objects - Outbound connections keep Durable Objects alivehttps://developers.cloudflare.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/https://developers.cloudflare.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/<p>Durable Objects now remain alive for the duration of active outbound connections created via <a href="https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/"><code>connect()</code></a> or an outbound WebSocket. Previously, a Durable Object would be evicted after 70-140 seconds of no incoming traffic, even if the object had an open outbound connection, which is a common pattern when streaming responses from a large language model (LLM) over TCP or an outbound WebSocket.</p> <p>With this change, each active outbound connection prevents eviction. Once all outbound connections close, the standard 70-140 second inactivity window applies before the Durable Object is evicted.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-streaming-connections-were-cut-off-by-eviction">Before: streaming connections were cut off by eviction</h4><a class="anchor-link" href="#before-streaming-connections-were-cut-off-by-eviction"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=360,format=svg/_astro/outbound-connection-before.jZgN3tY3.svg" alt="Timeline showing a Durable Object evicted 70-140 seconds after the last incoming request, cutting off an in-flight LLM stream while the outbound connection is still open" loading="lazy" decoding="async" width="820" height="360"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="after-active-outbound-connections-keep-the-durable-object-alive">After: active outbound connections keep the Durable Object alive</h4><a class="anchor-link" href="#after-active-outbound-connections-keep-the-durable-object-alive"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=360,format=svg/_astro/outbound-connection-after.CxPT16q0.svg" alt="Timeline showing the same outbound stream completing because the active connection keeps the Durable Object alive, with the inactivity window starting only after the connection closes" loading="lazy" decoding="async" width="820" height="360"> <p>If you are <a href="https://developers.cloudflare.com/agents/">building agents on Cloudflare</a>, this is especially relevant. An agent that streams tokens from an LLM while <a href="https://developers.cloudflare.com/agents/concepts/calling-llms/">calling models</a>, or that performs <a href="https://developers.cloudflare.com/agents/concepts/agentic-patterns/long-running-agents/">long-running tasks</a> over an outbound connection, now stays alive for the duration of that connection instead of being evicted mid-stream.</p> <p><strong>Limits:</strong></p> <ul> <li>Each outbound connection keeps the Durable Object alive for a maximum of <strong>15 minutes</strong>. After 15 minutes, the connection stops preventing eviction (the connection itself continues operating), and the <a href="https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/">standard eviction rules</a> resume.</li> <li>The Durable Object's existing <a href="https://developers.cloudflare.com/durable-objects/platform/limits/">per-account instance limits</a> still apply.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/">Lifecycle of a Durable Object</a>.</p>Fri, 19 Jun 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkers - Temporary accounts for AI agent deploymentshttps://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/https://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/<p>AI agents can now deploy Workers to Cloudflare without first requiring a user to sign up, open a browser-based OAuth flow, click through the dashboard, or create an API token. When an agent tries to deploy without Cloudflare credentials, Wrangler can tell it to rerun with <code>--temporary</code>, then deploy the Worker to a temporary preview account.</p> <p>To try this with your agent, update to Wrangler 4.102.0 or later, make sure you are logged out (<code>wrangler logout</code>), and then ask your agent to build something and deploy it to Cloudflare. The agent should follow Wrangler's output and deploy using the <code>--temporary</code> flag.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1748,height=368,format=webp/_astro/claim-deployments-flow.Co0tUHG4.png" alt="Diagram showing an AI agent deploying, verifying, and redeploying a Worker to a temporary account, then claiming it after authentication and moving it to a permanent account" loading="lazy" decoding="async" width="1748" height="368"> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-dzsirb"> --temporary</span></span></code></pre></figure> <p>The temporary deployment stays live for 60 minutes. During that window, the agent can verify the Worker, redeploy changes, and return both the live Worker URL and claim URL. Opening the claim URL lets you sign in to or create a Cloudflare account and make the temporary account permanent.</p> <p>Temporary preview accounts currently support a limited set of products, including Workers, Workers Static Assets, Workers KV, D1, Durable Objects, Hyperdrive, Queues, and SSL/TLS certificates. For supported products, limits, and claim behavior, refer to <a href="https://developers.cloudflare.com/workers/platform/claim-deployments/">Claim deployments (temporary accounts)</a>.</p> <p>For more context, refer to <a href="https://blog.cloudflare.com/temporary-accounts/" target="_blank" rel="noopener">Temporary Cloudflare Accounts for Agents<span class="external-link"> ↗</span></a>.</p>Fri, 19 Jun 2026 00:00:00 GMTWorkersWorkersCloudflare One, Access - Cloudflare identity provider is now the default for new accountshttps://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-idp-default/https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-idp-default/<p>When you create a new Zero Trust organization, Cloudflare now adds the <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/">Cloudflare identity provider</a> as your default login method. Previously, new organizations started with <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/one-time-pin/">one-time PIN (OTP)</a>.</p> <p>With the Cloudflare identity provider, your users authenticate using their existing Cloudflare account credentials, and authentication is restricted to members of your account. You can still add OTP or connect any <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/">third-party identity provider</a> whenever you need to.</p> <p>This change only applies to newly created accounts. Existing organizations keep the login methods they already have configured. If you would like to use the Cloudflare Identity Provider in an existing account, you must enable it.</p>Thu, 18 Jun 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessContainers - exec() is now available for Containershttps://developers.cloudflare.com/changelog/post/2026-06-18-container-exec/https://developers.cloudflare.com/changelog/post/2026-06-18-container-exec/ <p><code>exec()</code> is now available for <a href="https://developers.cloudflare.com/containers/">Containers</a>. Use <code>this.ctx.container.exec()</code> to start processes inside a running Container, stream standard input and output, inspect exit codes, and signal each process.</p> <p>Call <code>exec()</code> from a class extending <code>Container</code>, or from another Durable Object through <code>this.ctx.container</code>. The associated Container must already be running.</p> <p>This example starts the Container when needed, then reads its Node.js version:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Container } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/containers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyContainer</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Container</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> readVersion</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.container.running) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">start</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> process</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">([</span><span class="nb-shiki-mdbnqw">"node"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"--version"</span><span class="nb-shiki-140thh">]);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> output</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> process.</span><span class="nb-shiki-1t8gfj">output</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> decoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextDecoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> exitCode: output.exitCode,</span></span> <span class="line"><span class="nb-shiki-140thh"> stdout: decoder.</span><span class="nb-shiki-1t8gfj">decode</span><span class="nb-shiki-140thh">(output.stdout),</span></span> <span class="line"><span class="nb-shiki-140thh"> stderr: decoder.</span><span class="nb-shiki-1t8gfj">decode</span><span class="nb-shiki-140thh">(output.stderr),</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Container } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/containers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyContainer</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Container</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> readVersion</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.container.running) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">start</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> process</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">([</span><span class="nb-shiki-mdbnqw">"node"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"--version"</span><span class="nb-shiki-140thh">]);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> output</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> process.</span><span class="nb-shiki-1t8gfj">output</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> decoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextDecoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> exitCode: output.exitCode,</span></span> <span class="line"><span class="nb-shiki-140thh"> stdout: decoder.</span><span class="nb-shiki-1t8gfj">decode</span><span class="nb-shiki-140thh">(output.stdout),</span></span> <span class="line"><span class="nb-shiki-140thh"> stderr: decoder.</span><span class="nb-shiki-1t8gfj">decode</span><span class="nb-shiki-140thh">(output.stderr),</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>The command array starts an executable directly, without an implicit shell. Invoke a shell explicitly for pipes, redirects, or variable expansion.</p> <p>One RPC method can coordinate multiple <code>exec()</code> calls in one caller-to-Durable Object round trip. It can also pass byte-oriented <code>ReadableStream</code> input or return streamed output with flow control.</p> <p>For options and streaming examples, refer to <a href="https://developers.cloudflare.com/containers/execute-commands/">Execute commands</a>.</p>Thu, 18 Jun 2026 00:00:00 GMTContainersContainersHyperdrive, Workers - Create PlanetScale Postgres and MySQL databases, billed to your Cloudflare accounthttps://developers.cloudflare.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/https://developers.cloudflare.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/ <p>You can create PlanetScale Postgres and MySQL databases from Cloudflare and bill PlanetScale database usage through your Cloudflare account as a pay-as-you-go customer. Cloudflare contract customers will be able to add PlanetScale usage to their contract in July so reach out to your Cloudflare account team if interested.</p> <p>Create a PlanetScale database from the Cloudflare dashboard to check out globally distributed Workers optimized for regional data access.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers/hyperdrive?modal=1&amp;type=planetscale&amp;step=1" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Create a PlanetScale database</strong>&nbsp;&#8599;</a><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1280,height=240,format=svg/_astro/planetscale-request-flow.CYsRfKtG.svg" alt="Request flow from a user to Workers, Hyperdrive caches, connection pools, and PlanetScale." loading="lazy" decoding="async" width="1280" height="240"> <p>PlanetScale databases created from Cloudflare work with <a href="https://developers.cloudflare.com/workers/">Workers</a> through <a href="https://developers.cloudflare.com/hyperdrive/">Hyperdrive</a>. Hyperdrive manages database connection pools and query caching, so you can use PlanetScale as a centralized relational database for Workers applications without changing your database drivers, object-relational mapping (ORM) libraries, or SQL tooling.</p> <p>PlanetScale usage appears on your Cloudflare invoice each billing period as a dollar total at PlanetScale's standard <a href="https://planetscale.com/pricing" target="_blank" rel="noopener">pricing<span class="external-link"> ↗</span></a>. You can introspect per-database billing usage via PlanetScale's <a href="https://planetscale.com/docs/billing#organization-usage-and-billing-page" target="_blank" rel="noopener">dashboard<span class="external-link"> ↗</span></a>.</p> <p>When you create a PlanetScale database from the Cloudflare dashboard, you receive the same PlanetScale developer experience, including development branches, query insights, and Model Context Protocol (MCP) server support for agents.</p> <p>To get started, refer to <a href="https://developers.cloudflare.com/hyperdrive/planetscale/">PlanetScale Postgres and MySQL with Hyperdrive</a>.</p>Thu, 18 Jun 2026 00:00:00 GMTHyperdriveHyperdriveWorkersRadar - Updated Workers AI popularity metric in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-06-18-radar-workers-ai-inference-metric/https://developers.cloudflare.com/changelog/post/2026-06-18-radar-workers-ai-inference-metric/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> has changed how it measures <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> model and task popularity.</p> <p>Previously, popularity was based on the number of unique accounts running inferences against each model or task. It is now based on the <strong>number of inferences</strong>, giving a more representative view of actual usage volume. This change will affect all new measurements as well as historical data. As a result, the model and task distributions shown on Radar may differ from what you saw previously, and historical trends may shift accordingly.</p> <p>The <a href="https://radar.cloudflare.com/ai-insights#workers-ai-model-popularity" target="_blank" rel="noopener">Workers AI model popularity<span class="external-link"> ↗</span></a> chart shows the distribution of inferences across models.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=938,format=webp/_astro/workers-ai-model-popularity.CMw_WVXg.png" alt="Screenshot of the Workers AI model popularity chart on the AI Insights page" loading="lazy" decoding="async" width="1600" height="938"> <p>The <a href="https://radar.cloudflare.com/ai-insights#workers-ai-task-popularity" target="_blank" rel="noopener">Workers AI task popularity<span class="external-link"> ↗</span></a> chart shows the distribution of inferences across tasks.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=938,format=webp/_astro/workers-ai-task-popularity.ZoA-NO8k.png" alt="Screenshot of the Workers AI task popularity chart on the AI Insights page" loading="lazy" decoding="async" width="1600" height="938"> <p>The same data is available via the following API endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/methods/summary_v2/"><code>/ai/inference/summary/{dimension}</code></a></li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/methods/timeseries_groups_v2/"><code>/ai/inference/timeseries_groups/{dimension}</code></a></li> </ul> <p>Explore the data on the <a href="https://radar.cloudflare.com/ai-insights" target="_blank" rel="noopener">AI Insights page<span class="external-link"> ↗</span></a>.</p>Thu, 18 Jun 2026 00:00:00 GMTRadarRadarSpeed - Cloudflare Fonts error handling and security improvementshttps://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-fonts-error-handling-security/https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-fonts-error-handling-security/<p>Cloudflare Fonts now forwards <code>/cf-fonts</code> requests to your origin server when it encounters invalid paths or unexpected runtime errors, instead of returning 4xx or 5xx responses directly. This update also adds additional input validation to enhance security.</p>Thu, 18 Jun 2026 00:00:00 GMTSpeedSpeedArtifacts - Manage Artifacts from the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-06-17-dashboard-management/https://developers.cloudflare.com/changelog/post/2026-06-17-dashboard-management/<p>You can now configure <a href="https://developers.cloudflare.com/artifacts/concepts/how-artifacts-works/">Artifacts</a> namespaces, repos, and tokens directly from the Cloudflare dashboard.</p> <p>Artifacts is Git-compatible storage that lets you store repos on Cloudflare and interact with them using standard Git workflows.</p> <p>You can view and create <a href="https://developers.cloudflare.com/artifacts/concepts/namespaces/#use-namespaces-as-containers">namespaces</a>, which are top-level containers for repos:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1804,height=598,format=webp/_astro/dashboard-namespaces.0BJelWZh.png" alt="Artifacts namespaces dashboard showing namespace search and create namespace controls" loading="lazy" decoding="async" width="1804" height="598"> <p>You can view, create, fork, and search repos within a namespace:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1874,height=592,format=webp/_astro/dashboard-repositories.M9P9JUL_.png" alt="Artifacts repositories dashboard showing repo source, access, and created columns" loading="lazy" decoding="async" width="1874" height="592"> <p>You can open a repo to view its files and copy its Git remote URL.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2194,height=806,format=webp/_astro/dashboard-repo-overview.CSHxrCW2.png" alt="Artifacts repository overview showing files, commits, token management, and quick actions" loading="lazy" decoding="async" width="2194" height="806"> <p>You can also provision tokens directly from the dashboard to scope Git access to a single repo, with read tokens for clone, fetch, and pull workflows, or write tokens when a client needs to push changes.</p> <p>To get started, go to the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> and select <strong>Storage &amp; databases</strong> &gt; <strong>Artifacts</strong>.</p> <p>If you are enrolled in the Artifacts beta, you can use the dashboard to set up Artifacts. If you would like to join the beta, complete the <a href="https://forms.gle/DwBoPRa3CWQ8ajFp7" target="_blank" rel="noopener">request form<span class="external-link"> ↗</span></a>.</p>Wed, 17 Jun 2026 12:00:00 GMTArtifactsArtifactsSSL/TLS - Post-quantum ML-DSA certificates for Authenticated Origin Pulls and Custom Origin Trust Storehttps://developers.cloudflare.com/changelog/post/2026-06-17-pqc-mldsa-aop-cots/https://developers.cloudflare.com/changelog/post/2026-06-17-pqc-mldsa-aop-cots/<p>Cloudflare now accepts <a href="https://csrc.nist.gov/pubs/fips/204/final" target="_blank" rel="noopener">ML-DSA<span class="external-link"> ↗</span></a> (FIPS 204) post-quantum certificates on the connection between Cloudflare's edge and your origin server. Combined with our existing <a href="https://developers.cloudflare.com/ssl/post-quantum-cryptography/#hybrid-key-agreement">X25519MLKEM768</a> key agreement, this lets you establish end-to-end post-quantum authentication on the Cloudflare-to-origin connection.</p> <p>ML-DSA is supported in two origin-facing features:</p> <ul> <li><a href="https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/">Authenticated Origin Pulls</a> (AOP) — upload an ML-DSA client certificate that Cloudflare will present during the mTLS handshake to your origin. Available at both zone-level and per-hostname scopes.</li> <li><a href="https://developers.cloudflare.com/ssl/origin-configuration/custom-origin-trust-store/">Custom Origin Trust Store</a> (COTS) — upload an ML-DSA certificate authority that Cloudflare will trust when validating your origin server certificate under <a href="https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full-strict/">Full (strict) encryption mode</a>.</li> </ul> <p>Refer to <a href="https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-to-origin/#post-quantum-signatures">Post-quantum signatures</a> for certificate generation and setup guidance, and to <a href="https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-cloudflare-products/">PQC in Cloudflare products</a> for the current post-quantum deployment status across Cloudflare.</p>Wed, 17 Jun 2026 00:00:00 GMTSSL/TLSSSL/TLSAgents, Workers - Agents SDK improves browser automation, code execution, and recoveryhttps://developers.cloudflare.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/https://developers.cloudflare.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> makes it easier to build agents that can safely interact with real systems and keep working through interruptions.</p> <p>Agents can now browse websites through Browser Run, write code against external tools through Code Mode, use client-provided tools when delegating to Think sub-agents, and recover more reliably from deploys, Durable Object evictions, and connection churn.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="safer-browser-automation">Safer browser automation</h4><a class="anchor-link" href="#safer-browser-automation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agents can now use <a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> through a single durable <code>browser_execute</code> tool. Instead of choosing from a fixed list of actions, the model writes code against the Chrome DevTools Protocol (CDP) and can inspect pages, capture screenshots, read rendered content, debug frontend behavior, and interact with live browser sessions.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> browserTools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createBrowserTools</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx,</span></span> <span class="line"><span class="nb-shiki-140thh"> browser: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> session: { mode: </span><span class="nb-shiki-mdbnqw">"dynamic"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> browserTools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createBrowserTools</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx,</span></span> <span class="line"><span class="nb-shiki-140thh"> browser: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> session: { mode: </span><span class="nb-shiki-mdbnqw">"dynamic"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Browser sessions can be one-time, reused, or promoted from one-time to persistent during a run. This is useful when an agent needs a human to log in, complete MFA, or approve a sensitive action. The run can pause, keep the same tabs and cookies, and resume after approval.</p> <p>The browser tools also add Live View URLs, optional session recording, and quick actions such as <code>browser_markdown</code>, <code>browser_extract</code>, <code>browser_links</code>, and <code>browser_scrape</code> for one-shot browsing tasks.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resumable-code-execution-with-approvals">Resumable code execution with approvals</h4><a class="anchor-link" href="#resumable-code-execution-with-approvals"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Code Mode now uses <code>createCodemodeRuntime</code>, connectors, and a durable execution log. This lets you give a model one <code>codemode</code> tool instead of a large prompt full of tool definitions. The model can discover the capabilities it needs, write code against typed globals, and reuse saved snippets.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> runtime</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodemodeRuntime</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx,</span></span> <span class="line"><span class="nb-shiki-140thh"> executor: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> connectors: [</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> GithubConnector</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx, </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env, connection)],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> messages,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: { codemode: runtime.</span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">() },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> runtime</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodemodeRuntime</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx,</span></span> <span class="line"><span class="nb-shiki-140thh"> executor: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> connectors: [</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> GithubConnector</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx, </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env, connection)],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> messages,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: { codemode: runtime.</span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">() },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>When the code reaches an approval-gated action, the runtime pauses execution and returns a pending approval. After approval, completed calls replay from the durable log, the approved action runs, and the same code continues. This makes it practical to build agents that create issues, update external systems, or perform other side effects without custom pause-and-resume logic for every tool.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="better-think-delegation">Better Think delegation</h4><a class="anchor-link" href="#better-think-delegation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Think sub-agents can now use client-defined tools over the RPC <code>chat()</code> path. A parent agent can pass tool schemas with <code>clientTools</code> and resolve tool calls through <code>onClientToolCall</code>. This lets delegated agents use caller-provided capabilities without requiring a browser WebSocket.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> child.</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(message, callback, {</span></span> <span class="line"><span class="nb-shiki-140thh"> signal,</span></span> <span class="line"><span class="nb-shiki-140thh"> clientTools: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"get_user_timezone"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get the caller's timezone"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parameters: { type: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onClientToolCall</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">toolName</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">input</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> runClientTool</span><span class="nb-shiki-140thh">(toolName, input);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> child.</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(message, callback, {</span></span> <span class="line"><span class="nb-shiki-140thh"> signal,</span></span> <span class="line"><span class="nb-shiki-140thh"> clientTools: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"get_user_timezone"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get the caller's timezone"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parameters: { type: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onClientToolCall</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">toolName</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">input</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> runClientTool</span><span class="nb-shiki-140thh">(toolName, input);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Think Workflows also improve <code>step.prompt()</code>. A prompt step now runs a full agentic turn before returning structured output, so the agent can call tools before producing the typed result. This makes Workflow steps more useful for durable triage, research, and approval flows.</p> <p>The unified Think execute tool can also include <code>cdp.*</code> browser capabilities alongside <code>state.*</code> and <code>tools.*</code> when Browser Run is bound.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="voice-output-device-selection">Voice output device selection</h4><a class="anchor-link" href="#voice-output-device-selection"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Voice clients can route assistant audio to a specific output device. Use <code>outputDeviceId</code> with <code>useVoiceAgent</code>, or call <code>client.setOutputDevice()</code> from the framework-agnostic client.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> voice</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useVoiceAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"MyVoiceAgent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> outputDeviceId: selectedSpeakerId,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="tsx"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tsx" data-nb-lang="tsx"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> voice</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useVoiceAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"MyVoiceAgent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> outputDeviceId: selectedSpeakerId,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Browsers without speaker-selection support continue playing through the default output device and report a non-fatal <code>outputDeviceError</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="reliability-fixes">Reliability fixes</h4><a class="anchor-link" href="#reliability-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This release includes several fixes for production agents:</p> <ul> <li><code>useAgent</code> and <code>AgentClient</code> handle WebSocket replacement more reliably during reconnects and configuration changes.</li> <li>Chat stream replay is more reliable after reconnects, deploys, and provider errors.</li> <li>Fiber recovery continues across multi-pass scans and backs off when recovery hooks keep failing.</li> <li>Agent teardown continues even when the request that started teardown is canceled.</li> <li>Large session histories use byte-budgeted reads to reduce memory pressure during startup.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-npm" id="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-yarn" id="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-pnpm" id="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-bun" id="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-npm" aria-labelledby="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-yarn" aria-labelledby="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-pnpm" aria-labelledby="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-bun" aria-labelledby="pm-tab-pm-d692c395-5971-4b6b-aae1-bc2ed5f0b3d8-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Refer to the <a href="https://developers.cloudflare.com/agents/tools/codemode/">Code Mode documentation</a>, <a href="https://developers.cloudflare.com/agents/tools/browser/">Browser tools documentation</a>, <a href="https://developers.cloudflare.com/agents/harnesses/think/tools/">Think tools documentation</a>, and <a href="https://developers.cloudflare.com/agents/communication-channels/voice/">Voice documentation</a> for more information.</p>Tue, 16 Jun 2026 00:00:00 GMTAgentsAgentsWorkersAI Crawl Control - Pay Per Crawl advanced configurationhttps://developers.cloudflare.com/changelog/post/2026-06-16-pay-per-crawl-advanced-configuration/https://developers.cloudflare.com/changelog/post/2026-06-16-pay-per-crawl-advanced-configuration/<p>You can now configure advanced Pay Per Crawl settings for your zone, including:</p> <ul> <li><strong>Disable Pay Per Crawl by URI pattern</strong> using <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a> to offer free access to specific pages while charging for others.</li> <li><strong>Dynamic pricing</strong> by having your origin return a <code>crawler-price</code> response header, or by using a <a href="https://developers.cloudflare.com/workers/">Cloudflare Worker</a> to set prices based on request properties.</li> </ul> <p>When dynamic pricing is enabled, Pay Per Crawl adds a <code>cf-pay-per-crawl</code> request header to origin requests so your origin or Worker can determine the appropriate price.</p> <p>Refer to the <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-site-owner/advanced-configuration/">Advanced configuration documentation</a> for details.</p>Tue, 16 Jun 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlCloudflare Images - New optimization features in Imageshttps://developers.cloudflare.com/changelog/post/2026-06-16-new-optimization-features/https://developers.cloudflare.com/changelog/post/2026-06-16-new-optimization-features/<p>These updates introduce new features for optimizing and manipulating with Images:</p> <ul> <li><strong>New <code>composite</code> option:</strong> Control how <a href="https://developers.cloudflare.com/images/optimization/draw-overlays/#composite">overlays are blended</a> with the base image.</li> <li><strong>Percentage widths:</strong> Set the dimensions of an overlay as <a href="https://developers.cloudflare.com/images/optimization/draw-overlays/#width-and-height">a fraction of the dimensions</a> of the base image.</li> <li><strong>New <code>fit</code> modes:</strong> Use <a href="https://developers.cloudflare.com/images/optimization/features/#aspect-crop"><code>aspect-crop</code></a> to always preserve the target aspect ratio or <a href="https://developers.cloudflare.com/images/optimization/features/#scale-up"><code>scale-up</code></a> to always enlarge images.</li> <li><strong>New <code>upscale</code> parameter:</strong> Apply <a href="https://developers.cloudflare.com/images/optimization/features/#upscale">AI upscaling</a> to produce sharper, more detailed results when enlarging images.</li> </ul>Tue, 16 Jun 2026 00:00:00 GMTCloudflare ImagesCloudflare ImagesWorkers, Agents, Workers AI - Introducing GLM-5.2 on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-06-16-glm-5.2-workers-ai/https://developers.cloudflare.com/changelog/post/2026-06-16-glm-5.2-workers-ai/<p>We are excited to announce <strong>GLM-5.2</strong> on Workers AI, Z.ai's flagship agentic coding model.</p> <p><a href="https://developers.cloudflare.com/workers-ai/models/glm-5.2/"><code>@cf/zai-org/glm-5.2</code></a> is a text generation model built for agentic coding workflows. With function calling and reasoning support, it can handle long codebases, multi-step planning, and tool-augmented agents.</p> <p><strong>Key features and use cases:</strong></p> <ul> <li><strong>Agentic coding</strong>: Designed for autonomous coding tasks, long-horizon planning, and complex software engineering workflows</li> <li><strong>Large context window</strong>: GLM-5.2 supports up to a 1,048,576 token context window. Workers AI is launching the model with a 262,144 token context window and plans to increase this in the future</li> <li><strong>Function calling</strong>: Build agents that invoke tools and APIs across multiple conversation turns</li> <li><strong>Reasoning</strong>: Tackles complex problem-solving and step-by-step reasoning tasks</li> </ul> <p>Use GLM-5.2 through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/run</code> or <code>/v1/chat/completions</code>, or <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a>.</p> <p>Pricing is available on the <a href="https://developers.cloudflare.com/workers-ai/models/glm-5.2/">model page</a> or <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing page</a>.</p>Tue, 16 Jun 2026 00:00:00 GMTWorkersWorkersAgentsWorkers AIWorkers VPC - TCP connections via connect() over VPC Networkshttps://developers.cloudflare.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/https://developers.cloudflare.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/ <p><a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Network</a> bindings now support the <a href="https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/"><code>connect()</code></a> Socket API for raw TCP connections to private destinations, in addition to HTTP traffic via <code>fetch()</code>.</p> <p>This means Workers can now open TCP sockets to any private service reachable through the bound Cloudflare Tunnel, Cloudflare Mesh, or Cloudflare WAN on-ramp — Redis, Memcached, MQTT, custom binary protocols, or any other TCP-based service.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "vpc_networks"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"PRIVATE_NETWORK"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "network_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf1:network"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">vpc_networks</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"PRIVATE_NETWORK"</span></span> <span class="line"><span class="nb-shiki-140thh">network_id = </span><span class="nb-shiki-mdbnqw">"cf1:network"</span></span> <span class="line"><span class="nb-shiki-140thh">remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>At runtime, use <code>connect()</code> on the binding to open a TCP socket to a private destination:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Open a TCP connection to a private Redis instance</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> socket</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">PRIVATE_NETWORK</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"10.0.1.50:6379"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Write a Redis PING command</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> socket.writable.</span><span class="nb-shiki-1t8gfj">getWriter</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"PING</span><span class="nb-shiki-dzsirb">\r\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(socket.readable);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p><code>connect()</code> over VPC Networks currently supports plaintext TCP only.</p></div></div></aside> <p>For more details, refer to <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Networks</a> and the <a href="https://developers.cloudflare.com/workers-vpc/api/">Workers Binding API</a>.</p>Tue, 16 Jun 2026 00:00:00 GMTWorkers VPCWorkers VPCWorkers - Workers tracing now supports custom spanshttps://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/<p>You can now create custom trace spans in your Workers code using <code>tracing.enterSpan()</code>. Custom spans appear alongside the automatic platform instrumentation (fetch calls, KV reads, D1 queries, and other platform operations) in your traces and OpenTelemetry exports, with correct parent-child nesting.</p> <p>The API is available via <code>import { tracing } from "cloudflare:workers"</code> or through the handler context as <code>ctx.tracing</code>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tracing } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">enterSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"handleRequest"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">span</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"url.path"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url).pathname);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"key"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(data);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Spans nest automatically based on the JavaScript async context, and are auto-ended when the callback returns or its returned promise settles. The <code>Span</code> object provides <code>setAttribute(key, value)</code> for attaching metadata and an <code>isTraced</code> property to check whether the current request is being sampled.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1988,height=670,format=webp/_astro/wobs_custom_spans_screenshot.B-hsHjyv.png" alt="Trace waterfall showing custom spans nested alongside automatic KV and fetch instrumentation" loading="lazy" decoding="async" width="1988" height="670"> <p><a href="https://developers.cloudflare.com/workers/observability/traces/#how-to-enable-tracing">Tracing must be enabled</a> in your Wrangler configuration for spans to be recorded.</p> <p>For full API details and examples, refer to <a href="https://developers.cloudflare.com/workers/observability/traces/custom-spans/">Custom spans</a>.</p>Tue, 16 Jun 2026 00:00:00 GMTWorkersWorkersWAF - Use Cloudforce One threat intelligence in WAF ruleshttps://developers.cloudflare.com/changelog/post/2026-06-15-threat-intelligence-fields/https://developers.cloudflare.com/changelog/post/2026-06-15-threat-intelligence-fields/<p>You can now match incoming requests against Cloudforce One threat intelligence in your WAF rules. A new detection looks up the client IP address of each request against the threat intelligence database. If the IP was involved in threat activity in the past seven days, Cloudflare populates <code>cf.intel.ip.*</code> fields that you can use in <a href="https://developers.cloudflare.com/waf/custom-rules/">custom rules</a> and <a href="https://developers.cloudflare.com/waf/rate-limiting-rules/">rate limiting rules</a>.</p> <p>The detection populates the following fields. Use the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/functions/#any"><code>any()</code></a> function with the <code>[*]</code> wildcard to match array values:</p> <ul> <li><code>cf.intel.ip.datasets</code> — the dataset that flagged the IP address (<code>ddos</code> or <code>waf</code>).</li> <li><code>cf.intel.ip.target_industries</code> — industries the IP address has targeted.</li> <li><code>cf.intel.ip.attacker_names</code> — known threat actors associated with the IP address.</li> <li><code>cf.intel.ip.attacker_countries</code> — source countries of the threat activity.</li> <li><code>cf.intel.ip.target_countries</code> — countries the IP address has targeted.</li> </ul> <p>For example, the following custom rule expression blocks requests from IP addresses associated with DDoS activity that have targeted France:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">any(cf.intel.ip.target_countries[*] == "FR") and any(cf.intel.ip.datasets[*] == "ddos")</span></span></code></pre></figure> <p>These fields work with the Cloudflare API and Terraform. Matches are logged in <a href="https://developers.cloudflare.com/waf/analytics/security-analytics/">Security Analytics</a>.</p> <p>The threat intelligence detection is available to customers with an active <a href="https://developers.cloudflare.com/security-center/cloudforce-one/">Cloudforce One</a> subscription. For more information, refer to <a href="https://developers.cloudflare.com/waf/detections/threat-intelligence/">Threat intelligence</a>.</p>Mon, 15 Jun 2026 00:00:00 GMTWAFWAFWAF - WAF Release - 2026-06-15https://developers.cloudflare.com/changelog/post/2026-06-15-waf-release/https://developers.cloudflare.com/changelog/post/2026-06-15-waf-release/ <p>This week's release introduces new managed protection to address a critical SQL injection vulnerability in Ghost CMS (CVE-2026-26980) and a new generic rule designed to identify and block sophisticated SQL Injection (SQLi) bypass attempts leveraging obfuscated boolean logic. These rules protect affected installations from unauthorized data exfiltration at the network edge.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-26980: A blind SQL injection vulnerability in the Ghost CMS Content API (versions 3.24.0 to 6.19.0) allows unauthenticated remote attackers to inject malicious SQL commands via query parameters due to improper input validation.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="439c4ef64b32447989bdf412b4c29bc6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b4c29bc6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Ghost CMS - SQLi - CVE:CVE-2026-26980</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6c64b68ef5ed45e7a622cdaab56f403f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b56f403f</span></button></rule-id></td><td>N/A</td><td>SQLi - Obfuscated Boolean - URI</td><td>Log</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr></tbody></table>Mon, 15 Jun 2026 00:00:00 GMTWAFWAFAI Gateway - View the user agent of requests in AI Gateway logshttps://developers.cloudflare.com/changelog/post/2026-06-12-user-agent-logging/https://developers.cloudflare.com/changelog/post/2026-06-12-user-agent-logging/<p>AI Gateway logs now capture the user agent of the client that made each request, making it easier to identify which SDK, library, or application sent the traffic flowing through your gateway. For example, you can tell apart requests coming from <code>openai-python</code> versus a custom application or a Cloudflare Worker.</p> <p>The user agent appears alongside the other details in each log entry, and you can filter logs by user agent (equals, does not equal, or contains) in the dashboard.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/ai-gateway/observability/logging/">Logging</a>.</p>Fri, 12 Jun 2026 00:00:00 GMTAI GatewayAI GatewayDurable Objects, Workers - Filter Durable Objects metrics by object ID or namehttps://developers.cloudflare.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/https://developers.cloudflare.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/ <p>You can now filter the <strong>Metrics</strong> tab for a Durable Objects namespace by an individual Durable Object's <a href="https://developers.cloudflare.com/durable-objects/api/id/">ID</a> or <a href="https://developers.cloudflare.com/durable-objects/api/id/#name">name</a> in the Cloudflare dashboard. Previously, metrics charts only showed aggregate, namespace-level data, making it difficult to isolate the behavior of a specific object.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers/durable-objects" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Durable Objects</strong>&nbsp;&#8599;</a><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2936,height=1482,format=webp/_astro/durable-objects-metrics-dashboard.BFZTyhWU.png" alt="The Durable Objects Metrics tab filtered to a single object by ID, showing per-object requests and errors by invocation status." loading="lazy" decoding="async" width="2936" height="1482"> <p>Start typing an ID or name into the filter and select a match from the autocomplete dropdown. The autocomplete only shows objects with invocations during the selected time range, so an object that does not appear has not been invoked in that window. This does not necessarily mean the object has been deleted. Every chart on the page updates to reflect only the selected object. This makes it easier to identify and investigate a single Durable Object when debugging a high-traffic object, an error spike, or unexpected storage usage. Clear the filter to return to namespace-level metrics.</p> <p>Metrics are powered by the <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL Analytics API</a>, so standard analytics behavior such as ingestion delay and <a href="https://developers.cloudflare.com/analytics/faq/graphql-api-inconsistent-results/">sampling</a> applies.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/durable-objects/observability/metrics-and-analytics/">Metrics and analytics</a>.</p>Fri, 12 Jun 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersTerraform - Terraform v5.20.0 now availablehttps://developers.cloudflare.com/changelog/post/2026-06-12-terraform-v5.20.0-provider/https://developers.cloudflare.com/changelog/post/2026-06-12-terraform-v5.20.0-provider/<p>Cloudflare's Terraform v5 Provider makes it easy for developers to manage their Cloudflare infrastructure using a configuration as code approach. It releases every <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 weeks<span class="external-link"> ↗</span></a> to ensure that you can always manage the latest features in the platform. This week, we launched Terraform v5.20.0, which adds 24 new resources, bumps the underlying Go SDK to cloudflare-go v7, and includes a range of bug fixes and state upgraders based on community feedback.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-resources">New resources</h4><a class="anchor-link" href="#new-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>cloudflare_ai_search_namespace:</strong> Manage AI Search namespaces</li> <li><strong>cloudflare_custom_csr:</strong> Manage custom certificate signing requests</li> <li><strong>cloudflare_dls_prefix_binding:</strong> Manage DLS regional service prefix bindings</li> <li><strong>cloudflare_flagship_app:</strong> Manage Flagship feature flag apps</li> <li><strong>cloudflare_flagship_flag:</strong> Manage Flagship feature flags</li> <li><strong>cloudflare_google_tag_gateway:</strong> Manage Google Tag Gateway</li> <li><strong>cloudflare_load_balancer_monitor_group:</strong> Manage load balancer monitor groups</li> <li><strong>cloudflare_oauth_client:</strong> Manage IAM OAuth clients</li> <li><strong>cloudflare_origin_cloud_region:</strong> Manage origin cloud regions (v2 endpoints)</li> <li><strong>cloudflare_secrets_store:</strong> Manage Secrets Store instances</li> <li><strong>cloudflare_secrets_store_secret:</strong> Manage Secrets Store secrets</li> <li><strong>cloudflare_share:</strong> Manage resource shares</li> <li><strong>cloudflare_share_recipient:</strong> Manage share recipients</li> <li><strong>cloudflare_share_resource:</strong> Manage shared resources</li> <li><strong>cloudflare_zero_trust_device_deployment_groups:</strong> Manage Zero Trust device deployment groups</li> <li><strong>cloudflare_zero_trust_dlp_data_class:</strong> Manage DLP data classes</li> <li><strong>cloudflare_zero_trust_dlp_data_tag:</strong> Manage DLP data tags</li> <li><strong>cloudflare_zero_trust_dlp_data_tag_category:</strong> Manage DLP data tag categories</li> <li><strong>cloudflare_zero_trust_dlp_sensitivity_group:</strong> Manage DLP sensitivity groups</li> <li><strong>cloudflare_zero_trust_dlp_sensitivity_level:</strong> Manage DLP sensitivity levels</li> <li><strong>cloudflare_zero_trust_dlp_sensitivity_level_order:</strong> Manage DLP sensitivity level ordering</li> <li><strong>cloudflare_zero_trust_resource_library_application:</strong> Manage Zero Trust resource library applications</li> <li><strong>cloudflare_zero_trust_resource_library_category:</strong> Manage Zero Trust resource library categories</li> <li><strong>cloudflare_zero_trust_tunnel_warp_connector_config:</strong> Manage WARP connector tunnel configurations</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>cache:</strong> add create (POST) method for smart_tiered_cache</li> <li><strong>cache:</strong> update OPCR config to v2 endpoints</li> <li><strong>dlp:</strong> promote classification Stainless config to main</li> <li><strong>dlp:</strong> add custom prompt topics endpoint</li> <li><strong>email_security_block_sender:</strong> state upgrader for v4 to v5 migration</li> <li><strong>email_security_impersonation_registry:</strong> state upgrader for v4 to v5 migration</li> <li><strong>email_security_trusted_domains:</strong> state upgrader for v4 to v5 migration</li> <li><strong>snippets:</strong> add Terraform <code>id_property</code> annotations for snippet and snippet_rules</li> <li>bump Go SDK to cloudflare-go v7</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_member:</strong> missing upgrade path from v5.0–v5.15</li> <li><strong>authenticated_origin_pulls_settings:</strong> nil pointer panic</li> <li><strong>bot_management:</strong> restore <code>content_bots_protection</code> handling in model.go</li> <li><strong>dns_record:</strong> prevent FQDN normalization from swallowing name shortening changes</li> <li><strong>list:</strong> nullify empty nested objects to prevent inconsistent result after apply</li> <li><strong>load_balancer_pool:</strong> accept early-v5 object-shape state at schema_version=0</li> <li><strong>load_balancer_pool:</strong> add <code>UseStateForUnknown</code> for <code>load_shedding</code> attribute to prevent drift</li> <li><strong>r2_custom_domain:</strong> restore degraded-response handling in resource.go</li> <li><strong>regional_hostname:</strong> update cloudflare-go imports from v6 to v7</li> <li><strong>secrets_store:</strong> fix model/schema parity and guard acceptance tests</li> <li><strong>spectrum_application:</strong> accept early-v5 object-shape state at schema_version=0</li> <li><strong>worker:</strong> preserve <code>observability.traces.propagation_policy</code> across reads</li> <li><strong>worker:</strong> add <code>propagation_policy</code> to observability defaults</li> <li><strong>worker_version:</strong> restore handwritten D1 <code>database_id</code> handling</li> <li><strong>workers_custom_domain:</strong> missing <code>CertId</code> field in state migration</li> <li><strong>workers_script:</strong> restore annotations Read workaround stripped by codegen</li> <li><strong>zero_trust_access_identity_provider:</strong> change <code>read_only</code> from computed to optional</li> <li><strong>zero_trust_access_identity_provider:</strong> add <code>UseStateForUnknown</code> to SAML-only config fields</li> <li><strong>zero_trust_access_identity_provider:</strong> use <code>UseNonNullStateForUnknown</code> on scim_config fields</li> <li><strong>zero_trust_access_policy:</strong> populate <code>account_id</code> when migrating zone-scoped v4 state</li> <li><strong>zero_trust_access_policy:</strong> missing <code>common_names</code> transform in migration</li> <li>gracefully handle nil pointer dereference when config has <code>attributes_flat</code> during migration</li> <li>set initial schema version to 500 for all new resources</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="refactors">Refactors</h4><a class="anchor-link" href="#refactors"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Extracted <code>MoveState</code> nil guard into shared helper</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration" target="_blank" rel="noopener">Version 5 Migration Guide<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">List of stabilized resources<span class="external-link"> ↗</span></a></li> </ul>Fri, 12 Jun 2026 00:00:00 GMTTerraformTerraformWorkers AI - Moonshot AI Kimi K2.7 Code now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/https://developers.cloudflare.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/<p><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/"><code>@cf/moonshotai/kimi-k2.7-code</code></a> is now available on Workers AI. Kimi K2.7 Code is a code-optimized variant of the Kimi K2 family, built on a Mixture-of-Experts architecture with 1T total parameters and 32B active per token.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-coding-and-agent-performance">Improved coding and agent performance</h4><a class="anchor-link" href="#improved-coding-and-agent-performance"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>K2.7 Code delivers meaningful gains over K2.6 on coding and agentic benchmarks:</p> <ul> <li><strong>+21.8%</strong> on Kimi Code Bench v2</li> <li><strong>+11.0%</strong> on Program Bench</li> <li><strong>+31.5%</strong> on MLS Bench Lite</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="reasoning-efficiency">Reasoning efficiency</h4><a class="anchor-link" href="#reasoning-efficiency"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>K2.7 Code uses 30% fewer reasoning tokens compared to K2.6, reducing overthinking and lowering inference cost for reasoning-heavy workloads.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>262.1k token context window</strong> for retaining full conversation history, tool definitions, and codebases across long-running agent sessions</li> <li><strong>Long-horizon coding</strong> with improved instruction following and higher end-to-end coding task success rates</li> <li><strong>Vision inputs</strong> for processing images alongside text</li> <li><strong>Thinking mode</strong> with configurable reasoning depth via <code>chat_template_kwargs.thinking</code></li> <li><strong>Multi-turn tool calling</strong> for building agents that invoke tools across multiple conversation turns</li> <li><strong>Structured outputs</strong> with JSON schema support</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="differences-from-kimi-k26">Differences from Kimi K2.6</h4><a class="anchor-link" href="#differences-from-kimi-k26"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are migrating from Kimi K2.6, note the following:</p> <ul> <li>K2.7 Code is optimized for coding tasks with improved benchmark performance and reasoning efficiency</li> <li>Cached input token pricing is $0.19 per M tokens (vs $0.16 for K2.6)</li> <li>API usage is identical — no parameter changes required</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Kimi K2.7 Code through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/ai/run</code>, or the OpenAI-compatible endpoint at <code>/v1/chat/completions</code>. You can also use <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> with any of these endpoints.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/">Kimi K2.7 Code model page</a> and <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing</a>.</p>Fri, 12 Jun 2026 00:00:00 GMTWorkers AIWorkers AIBrowser Run - New formats parameter for the Browser Run /snapshot endpointhttps://developers.cloudflare.com/changelog/post/2026-06-11-browser-run-snapshot-formats/https://developers.cloudflare.com/changelog/post/2026-06-11-browser-run-snapshot-formats/ <p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a>'s <a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/"><code>/snapshot</code> endpoint</a> now supports a <code>formats</code> parameter that lets you return multiple page formats in a single API call. Previously, <code>/snapshot</code> returned only HTML content and a screenshot. You can now also include Markdown and the accessibility tree in the same response.</p> <p>These formats are particularly useful for AI agent workflows:</p> <ul> <li>Markdown provides a token-efficient representation of page content that LLMs can process directly, without parsing HTML markup.</li> <li>The accessibility tree provides a structured representation of a page's elements, including roles, labels, and hierarchy, helping LLMs understand page structure and navigate its contents.</li> </ul> <p>The following example returns a screenshot, Markdown, and the accessibility tree in one call:</p> <div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="curl" class><figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/&lt;accountId&gt;/browser-rendering/snapshot'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com/",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "formats": ["screenshot", "markdown", "accessibilityTree"]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript SDK" class><figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Cloudflare </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> apiToken: process.env[</span><span class="nb-shiki-mdbnqw">"CLOUDFLARE_API_TOKEN"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> snapshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.browserRendering.snapshot.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: process.env[</span><span class="nb-shiki-mdbnqw">"CLOUDFLARE_ACCOUNT_ID"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://example.com/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> formats: [</span><span class="nb-shiki-mdbnqw">"screenshot"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"markdown"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"accessibilityTree"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(snapshot.markdown);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(snapshot.accessibilityTree);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="Workers Bindings" class><figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> BROWSER</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> BrowserRun</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">quickAction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"snapshot"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://example.com/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> formats: [</span><span class="nb-shiki-mdbnqw">"screenshot"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"markdown"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"accessibilityTree"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>You must request at least two formats. If you only need one, use the respective single-format endpoint such as <a href="https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/"><code>/screenshot</code></a> or <a href="https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/"><code>/markdown</code></a>.</p> <p>Refer to the <a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/"><code>/snapshot</code> documentation</a> for the full list of accepted values.</p>Thu, 11 Jun 2026 00:00:00 GMTBrowser RunBrowser RunData Loss Prevention - Define custom topics for AI prompt protectionhttps://developers.cloudflare.com/changelog/post/2026-06-11-custom-ai-prompt-topics/https://developers.cloudflare.com/changelog/post/2026-06-11-custom-ai-prompt-topics/<p>You can now define custom topics for AI prompt protection. Predefined <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics">AI prompt topics</a> cover common content and intent categories such as PII, source code, and jailbreak attempts. Custom topics let you detect unique or proprietary concepts that are not included in predefined categories.</p> <p>You describe a custom topic in natural language, and Cloudflare DLP detects whether a prompt matches that topic based on context rather than specific keywords. For example, a topic that describes confidential merger discussions matches a prompt that paraphrases the deal, even when the prompt never uses the word merger or names the companies involved. To detect literal values such as internal codenames or product identifiers, use a <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#custom-wordlist-datasets">custom wordlist or pattern entry</a> instead.</p> <p>Custom topics run through the same <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#granular-controls">application granular controls</a> path as predefined AI prompt topics. Custom topics are available for ChatGPT, Google Gemini, Perplexity, and Claude.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="create-a-custom-ai-prompt-topic">Create a custom AI prompt topic</h4><a class="anchor-link" href="#create-a-custom-ai-prompt-topic"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>In the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Zero Trust</strong> &gt; <strong>Data loss prevention</strong> &gt; <strong>Detection entries</strong>.</li> <li>Select <strong>AI prompt topics</strong>, then select <strong>Custom Prompt Topic</strong>.</li> <li>Describe the topic in natural language. Be specific about the concept you want to detect. For example, describe unreleased product roadmap details or confidential customer contract terms.</li> <li>Add this detection entry to an existing DLP profile, or <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/#build-a-custom-profile">create a new DLP profile</a>.</li> <li>Use the profile in a Gateway HTTP policy to log or block prompts that match the topic.</li> </ol> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Write the description as a concept to classify, not a list of keywords. For example, describe "internal financial forecasts and unreleased revenue figures" rather than listing specific document names.</p></div></div></aside> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics">AI prompt topics</a>.</p>Thu, 11 Jun 2026 00:00:00 GMTData Loss PreventionData Loss PreventionWorkers - Track Dynamic Workers usage from the dashboard and GraphQL APIhttps://developers.cloudflare.com/changelog/post/2026-06-11-dynamic-workers-count/https://developers.cloudflare.com/changelog/post/2026-06-11-dynamic-workers-count/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1476,height=1102,format=webp/_astro/dynamic-workers-count.BcGsgQ0m.png" alt="Dynamic Workers usage on the Workers overview page" loading="lazy" decoding="async" width="1476" height="1102"> <p>Customers can now view the number of <a href="https://developers.cloudflare.com/dynamic-workers/">Dynamic Workers</a> invoked during their billing period from the Workers overview page in the Cloudflare dashboard.</p> <p>This count reflects the number of Dynamic Workers that Cloudflare would bill for during the selected billing period. Dynamic Workers usage data only goes back to June 1, 2026.</p> <p>You can also query this count through the <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL Analytics API</a> by using <code>workersInvocationsByOwnerAndScriptGroups</code> and selecting <code>distinctDynamicWorkerCount</code>:</p> <figure class="nb-code-figure" data-nb-lang="graphql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="graphql" data-nb-lang="graphql"><code><span class="line"><span class="nb-shiki-1itgoe">query</span><span class="nb-shiki-1t8gfj"> getDynamicWorkersCount</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $accountTag</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">string</span><span class="nb-shiki-1itgoe">!</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $filter</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">AccountWorkersInvocationsByOwnerAndScriptGroupsFilter_InputObject</span></span> <span class="line"><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> viewer</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> accounts</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">filter</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-mdbnqw">accountTag</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$accountTag</span><span class="nb-shiki-140thh"> }) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workersInvocationsByOwnerAndScriptGroups</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">limit</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">10000</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">filter</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$filter</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> uniq</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> distinctDynamicWorkerCount</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Use variables to set the account and billing-period date range:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "accountTag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;ACCOUNT_ID&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "filter"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "date_geq"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-06-01"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "date_leq"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-06-30"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/dynamic-workers/pricing/">Dynamic Workers pricing</a>.</p>Thu, 11 Jun 2026 00:00:00 GMTWorkersWorkersAI Search - Manage AI Search namespaces with Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/https://developers.cloudflare.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports namespace-level Wrangler commands, making it easier to manage <a href="https://developers.cloudflare.com/ai-search/concepts/namespaces/">namespaces</a> from your terminal, scripts, and agent workflows.</p> <p>The following commands are available:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>wrangler ai-search namespace list</code></td> <td>List AI Search namespaces</td> </tr> <tr> <td><code>wrangler ai-search namespace create</code></td> <td>Create a new AI Search namespace</td> </tr> <tr> <td><code>wrangler ai-search namespace get</code></td> <td>Get details for a namespace</td> </tr> <tr> <td><code>wrangler ai-search namespace update</code></td> <td>Update a namespace description</td> </tr> <tr> <td><code>wrangler ai-search namespace delete</code></td> <td>Delete an AI Search namespace</td> </tr> </tbody> </table></div> <p>Create a namespace for a new application or tenant directly from the CLI:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> namespace</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> docs-production</span><span class="nb-shiki-dzsirb"> --description</span><span class="nb-shiki-mdbnqw"> "Production documentation search"</span></span></code></pre></figure> <p>List namespaces with pagination or filter by name or description:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> namespace</span><span class="nb-shiki-mdbnqw"> list</span><span class="nb-shiki-dzsirb"> --search</span><span class="nb-shiki-mdbnqw"> docs</span><span class="nb-shiki-dzsirb"> --page</span><span class="nb-shiki-dzsirb"> 1</span><span class="nb-shiki-dzsirb"> --per-page</span><span class="nb-shiki-dzsirb"> 10</span></span></code></pre></figure> <p>Use <code>--json</code> with <code>list</code>, <code>create</code>, <code>get</code>, and <code>update</code> to return structured output that automation and AI agents can parse directly.</p> <p>Instance-level commands also now support a <code>--namespace</code> flag, so you can interact with instances inside a specific namespace from the CLI:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> list</span><span class="nb-shiki-dzsirb"> --namespace</span><span class="nb-shiki-mdbnqw"> docs-production</span></span></code></pre></figure> <p>For full usage details, refer to the <a href="https://developers.cloudflare.com/ai-search/wrangler-commands/">AI Search Wrangler commands documentation</a>.</p>Wed, 10 Jun 2026 00:00:00 GMTAI SearchAI SearchDNS - Account-level DNS records quotahttps://developers.cloudflare.com/changelog/post/2026-06-10-account-level-record-quota/https://developers.cloudflare.com/changelog/post/2026-06-10-account-level-record-quota/<p>Cloudflare now enforces DNS records quotas at the account level for Enterprise accounts. Instead of a per-zone limit, these accounts have a quota on the total number of records across all of their zones, letting you distribute records across your zones however you like — regardless of each zone's plan. Public and internal zones are counted separately, each with a default quota of 1,000,000 records.</p> <p>Accounts without an account-level quota are unaffected: existing per-zone quotas behave exactly as before.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/dns/manage-dns-records/#dns-records-quota">DNS records quota</a>.</p>Wed, 10 Jun 2026 00:00:00 GMTDNSDNSFlagship - Flagship API reference now availablehttps://developers.cloudflare.com/changelog/post/2026-06-10-api-reference/https://developers.cloudflare.com/changelog/post/2026-06-10-api-reference/<p>The <strong><a href="https://developers.cloudflare.com/api/resources/flagship/">Flagship API reference</a></strong> is now available. You can use the Cloudflare API to create and update apps, and to create, update, delete, and list feature flags without using the dashboard.</p> <p>For example, create a new boolean flag with the API:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/flagship/apps/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/flags</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "key": "new-checkout",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "enabled": true,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "default_variation": "off",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "variations": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "off": false,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "on": true</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "rules": []</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>To create an API token, go to <a href="https://dash.cloudflare.com/?to=/:account/api-tokens" target="_blank" rel="noopener">Account API Tokens<span class="external-link"> ↗</span></a> in the Cloudflare dashboard and search for Flagship.</p> <p>The API reference includes endpoints for Flagship apps, flags, changelog entries, and flag evaluation. Agents can also use the <a href="https://github.com/cloudflare/skills/tree/main/skills/cloudflare/references/flagship" target="_blank" rel="noopener">Flagship reference in the Cloudflare skill<span class="external-link"> ↗</span></a> to create and manage Flagship resources.</p> <p>Refer to the <a href="https://developers.cloudflare.com/flagship/">Flagship documentation</a> to learn more about evaluating feature flags from your applications.</p>Wed, 10 Jun 2026 00:00:00 GMTFlagshipFlagshipCloudflare Images - Manage hosted images with the Images bindinghttps://developers.cloudflare.com/changelog/post/2026-06-10-hosted-images-binding/https://developers.cloudflare.com/changelog/post/2026-06-10-hosted-images-binding/<p>Use the Images binding to upload, list, retrieve, update, and delete images stored in Images directly from your Worker without managing API tokens or making HTTP requests.</p> <p>The <code>env.IMAGES.hosted</code> namespace supports the following storage and management operations:</p> <ul> <li><a href="https://developers.cloudflare.com/images/storage/binding/#uploadimage-options"><code>.upload(image, options)</code></a> — Upload a new image to your account.</li> <li><a href="https://developers.cloudflare.com/images/storage/binding/#listoptions"><code>.list(options)</code></a> — List images with pagination.</li> <li><a href="https://developers.cloudflare.com/images/storage/binding/#imageimageiddetails"><code>.image(imageId).details()</code></a> — Get image metadata.</li> <li><a href="https://developers.cloudflare.com/images/storage/binding/#imageimageidbytes"><code>.image(imageId).bytes()</code></a> — Stream the original image bytes.</li> <li><a href="https://developers.cloudflare.com/images/storage/binding/#imageimageidupdateoptions"><code>.image(imageId).update(options)</code></a> — Update metadata or access controls.</li> <li><a href="https://developers.cloudflare.com/images/storage/binding/#imageimageiddelete"><code>.image(imageId).delete()</code></a> — Delete an image.</li> </ul> <p>For example, you can upload an image from a request body and return its metadata:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">IMAGES</span><span class="nb-shiki-140thh">.hosted.</span><span class="nb-shiki-1t8gfj">upload</span><span class="nb-shiki-140thh">(request.body, {</span></span> <span class="line"><span class="nb-shiki-140thh"> filename: </span><span class="nb-shiki-mdbnqw">"upload.jpg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> metadata: { source: </span><span class="nb-shiki-mdbnqw">"worker"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(image);</span></span></code></pre></figure> <p>Or retrieve and serve the original bytes of a hosted image:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> bytes</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">IMAGES</span><span class="nb-shiki-140thh">.hosted.</span><span class="nb-shiki-1t8gfj">image</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"IMAGE_ID"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">bytes</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(bytes);</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/images/storage/binding/">Images binding</a>.</p>Wed, 10 Jun 2026 00:00:00 GMTCloudflare ImagesCloudflare ImagesSecurity Center - Automated Cease and Desist templates for Brand Protectionhttps://developers.cloudflare.com/changelog/post/2026-06-08-brand-protection-cease-and-desist-letters/https://developers.cloudflare.com/changelog/post/2026-06-08-brand-protection-cease-and-desist-letters/<p><strong>TL;DR:</strong> Brand Protection now features an <strong>Automated Cease &amp; Desist (C&amp;D)</strong> workflow. When you discover an infringing domain hosted outside of Cloudflare, you can instantly generate, review, and download a custom-branded, pre-filled legal notice in seconds.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This update introduces a major shift from pure detection to actionable enforcement, eliminating the manual burden for your Trust &amp; Safety and Legal teams:</p> <ul> <li><strong>Instant WHOIS and Recipient Lookup:</strong> We automatically scrape registrar data and WHOIS contact information (such as the registrant or registrar abuse email) behind the scenes, highlighting exactly where your notice needs to be sent</li> <li><strong>Smart Template Automation:</strong> We pre-fill your custom-branded templates with essential metadata, including the infringing domain, registrar name, and discovery date.</li> <li><strong>Tailored Enforcement Tones:</strong> Choose from three default layout strategies depending on the severity of the infrastructure match: <ul> <li><em>Exact Match:</em> A formal demand for identical trademark infringements</li> <li><em>Similar Match:</em> A standard notice optimized for typosquatting (one-character distance matches)</li> <li><em>Friendly Tone:</em> An amicable initial outreach for potential unintentional or accidental infringements</li> </ul> </li> <li><strong>Full Editing Control:</strong> Before creating the final PDF, a real-time review screen allows you to fine-tune the messaging, modify placeholders, and ensure your text aligns perfectly with internal legal standards</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When reviewing a malicious domain match inside your dashboard, your enforcement path splits depending on where the attacker is located:</p> <ol> <li><strong>On the Cloudflare Network:</strong> If the domain uses Cloudflare’s network or registrar, trigger our existing integrated abuse reporting flow with one click.</li> <li><strong>Hosted Elsewhere:</strong> If the domain is hosted on an external provider, click the <strong>Generate C&amp;D Letter</strong> option to launch the new document builder, pick your template, verify the auto-populated recipient data, and download your finalized PDF.</li> </ol> <p>You can manage your templates and enforce matches by going to the <strong>Cloudflare Dashboard &gt; Application Security &gt; Brand Protection</strong> and selecting your detected Brand Protection matches. For more information, read the <a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection documentation</a>.</p> <blockquote> <p><strong>Note:</strong> Cloudflare does not represent you and cannot provide you with legal advice. Only you can decide whether your rights have been infringed, whether a cease and desist letter is appropriate, and what that letter should say.</p> </blockquote>Wed, 10 Jun 2026 00:00:00 GMTSecurity CenterSecurity CenterSandbox SDK - Deprecating Sandbox SDK featureshttps://developers.cloudflare.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/https://developers.cloudflare.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/<aside role="note" aria-label="Sandbox SDK 1.0 preview" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Sandbox SDK 1.0 preview</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>A preview of <strong>Sandbox SDK 1.0</strong> is available on <code>@cloudflare/sandbox@next</code>. For new projects, or to move past these deprecations in one migration, refer to the <a href="https://developers.cloudflare.com/sandbox/1-0-preview/">Sandbox SDK 1.0 preview</a> and <a href="https://developers.cloudflare.com/sandbox/1-0-preview/migrate/">Migrate</a>.</p></div></div></aside> <p>Today we are announcing the deprecation of several features from the Sandbox SDK. The SDK has grown and matured substantially since it first launched. As agent workflows have developed, we have shipped many new features and experiments so developers can easily integrate secure, isolated code execution into their workflows.</p> <p>We want the SDK to continue providing a stable foundation for agentic workflows while we iterate quickly on the codebase. These deprecated features have either been superseded by newer capabilities or seen low adoption. Do not build new work on them. Migrate using the <a href="https://developers.cloudflare.com/sandbox/guides/2026-deprecation/">2026 deprecation migration guide</a>, or move to the <a href="https://developers.cloudflare.com/sandbox/1-0-preview/">Sandbox SDK 1.0 preview</a> when you can.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="http-and-websocket-transports">HTTP and WebSocket transports</h4><a class="anchor-link" href="#http-and-websocket-transports"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In April 2026, we released the new RPC transport and deprecated the WebSocket transport. This setting governs how the sandbox container talks to the Workers ecosystem. The RPC transport removes the limitations of both the HTTP and WebSocket transports. As of this announcement, RPC is the recommended default. HTTP and WebSocket transports are deprecated and will not ship in future Sandbox SDK majors.</p> <p>To migrate, update the <code>SANDBOX_TRANSPORT</code> variable to <code>rpc</code> or set the <code>transport</code> option when calling <code>getSandbox()</code>. For more information, refer to the <a href="https://developers.cloudflare.com/sandbox/configuration/transport/">transport configuration documentation</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="desktop">Desktop</h4><a class="anchor-link" href="#desktop"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The desktop feature ran a full Linux desktop inside the sandbox (display server, desktop environment, and VNC/noVNC) so agents and apps could drive a GUI with screenshots, mouse, and keyboard — the same <em>computer-use</em> shape other sandbox products expose for UI automation. Adoption stayed low, and we removed it in <code>0.10.2</code>. If you need that capability again, you can build it on top of the sandbox with <a href="https://developers.cloudflare.com/sandbox/1-0-preview/extensions/">extensions</a> rather than a built-in <code>sandbox.desktop</code> API.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="expose-ports">Expose ports</h4><a class="anchor-link" href="#expose-ports"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We recently released support for Cloudflare Tunnel in the Sandbox SDK. This provides a robust API for exposing services running in your sandbox to the public internet. It fixes issues many were facing with local development and deployment to <code>workers.dev</code> domains. To migrate from <code>exposePort()</code> to tunnels, refer to the <a href="https://developers.cloudflare.com/sandbox/api/tunnels/">tunnels API documentation</a> and the <a href="https://developers.cloudflare.com/sandbox/guides/expose-services/">expose services guide</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="default-sessions">Default sessions</h4><a class="anchor-link" href="#default-sessions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>By default, the <code>exec()</code> method in the Sandbox SDK maintains a default session across all calls, so a <code>cd</code> in one call is honored in the next. This convenience helped developers writing <code>exec</code> statements by hand, but confused agents and caused hard-to-trace bugs. As of <code>0.10.3</code>, we have introduced the <a href="https://developers.cloudflare.com/sandbox/configuration/sandbox-options/"><code>enableDefaultSession</code></a> flag on the <code>getSandbox()</code> interface to turn this off. Default sessions as a concept — and the flag — will be removed in an upcoming release.</p> <p>We recommend setting <code>enableDefaultSession: false</code> today and using the <a href="https://developers.cloudflare.com/sandbox/api/sessions/"><code>sandbox.createSession()</code> API</a> when you need the previous behavior.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-changes">Other changes</h4><a class="anchor-link" href="#other-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We are also consolidating all APIs that buffer data to support streaming by default. This includes <a href="https://developers.cloudflare.com/sandbox/api/files/"><code>readFile</code>, <code>writeFile</code></a>, and <a href="https://developers.cloudflare.com/sandbox/api/commands/"><code>exec</code></a>. The stream equivalents will be removed.</p> <p>We are exploring moving non-core features like the <a href="https://developers.cloudflare.com/sandbox/guides/code-execution/">code interpreter</a>, <a href="https://developers.cloudflare.com/sandbox/api/terminal/">terminal</a>, and <a href="https://developers.cloudflare.com/sandbox/guides/git-workflows/">git APIs</a> into helpers. These features will retain their existing APIs, so migration should be simple.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="next-steps">Next steps</h4><a class="anchor-link" href="#next-steps"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you use any of these features on the <strong>current stable</strong> package, refer to the <a href="https://developers.cloudflare.com/sandbox/guides/2026-deprecation/">2026 deprecation migration guide</a>. Coding agents can use the <strong><code>sandbox-stable</code></strong> skill for stable-package work and that guide for cleanup (<a href="https://developers.cloudflare.com/agent-setup/">Agent setup</a> · <a href="https://github.com/cloudflare/skills" target="_blank" rel="noopener">Cloudflare Skills<span class="external-link"> ↗</span></a>).</p> <p>If you are moving to <strong>Sandbox SDK 1.0</strong> (<code>@next</code>), use the <a href="https://developers.cloudflare.com/sandbox/1-0-preview/">1.0 preview</a> and <a href="https://developers.cloudflare.com/sandbox/1-0-preview/migrate/">Migrate</a> guides instead — or the <strong><code>sandbox-migrate-to-next</code></strong> skill after installing Cloudflare Skills. New projects should prefer <strong><code>sandbox-next</code></strong> on <code>@next</code>.</p> <p>For any questions, ask in the <a href="https://discord.gg/cloudflaredev" target="_blank" rel="noopener">Cloudflare Developers Discord<span class="external-link"> ↗</span></a>.</p>Tue, 09 Jun 2026 00:00:00 GMTSandbox SDKSandbox SDKWAF - WAF Release - 2026-06-09https://developers.cloudflare.com/changelog/post/2026-06-09-waf-release/https://developers.cloudflare.com/changelog/post/2026-06-09-waf-release/ <p>This release introduces new detections for a critical SQL injection vulnerability in Drupal installations utilizing PostgreSQL (CVE-2026-9082), alongside targeted protection for an unsafe deserialization flaw in the Mirasvit Cache Warmer extension (CVE-2026-45247). Additionally, this release includes coverage for a prototype pollution vector in Axios (CVE-2026-40175) and a new generic rule designed to identify and block sophisticated SQL Injection (SQLi) bypass attempts leveraging obfuscated boolean logic.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>CVE-2026-9082: A database abstraction vulnerability affects Drupal sites configured with a PostgreSQL backend. Remote, unauthenticated attackers can exploit this flaw via crafted inputs to inject malicious SQL commands and access or manipulate backend data.</p> </li> <li> <p>CVE-2026-45247: A PHP Object Injection vulnerability exists in the Mirasvit Cache Warmer extension for Magento and Adobe Commerce. This flaw stems from unsafe deserialization of untrusted user input, enabling unauthenticated attackers to execute arbitrary code on the hosting server.</p> </li> <li> <p>CVE-2026-40175: A prototype pollution vulnerability affects the Axios HTTP client library. Attackers can exploit this to inject malicious properties into the global JavaScript object prototype, potentially causing application crashes (Denial of Service) or executing unauthorized code depending on the application structure.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of these vulnerabilities could allow unauthenticated attackers to execute arbitrary code, manipulate database contents, or induce application crashes, leading to severe operational disruption or complete server compromise. These newly deployed signatures intercept these advanced malicious payloads at the edge before they can interact with vulnerable software configurations.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b4f88cb767874def810edd0b387cf935"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...387cf935</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Axios - Prototype Pollution - CVE:CVE-2026-40175</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="098997bb8b5f48abb4039bd6417eb9e0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...417eb9e0</span></button></rule-id></td><td>N/A</td><td>Drupal - PostgreSQL SQLi - CVE:CVE-2026-9082 - Body</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8a7650b99ec04a91a19b8295fd3857fd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fd3857fd</span></button></rule-id></td><td>N/A</td><td>Drupal - PostgreSQL SQLi - CVE:CVE-2026-9082 - URI</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="525c0871787840e6a6193f6caee241d2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...aee241d2</span></button></rule-id></td><td>N/A</td><td>SQLi - Obfuscated Boolean - Body</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1ec4aeaf7900463397b82b35d8620070"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d8620070</span></button></rule-id></td><td>N/A</td><td>SQLi - Obfuscated Boolean - Headers</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fb74766654c44ff2a5204dc4e0be4d47"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e0be4d47</span></button></rule-id></td><td>N/A</td><td>Mirasvit Cache Warmer - PHP Object Injection - CVE:CVE-2026-45247</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr></tbody></table>Tue, 09 Jun 2026 00:00:00 GMTWAFWAFEmail Service - Authenticated SMTP submission now available in betahttps://developers.cloudflare.com/changelog/post/2026-06-08-smtp-submission/https://developers.cloudflare.com/changelog/post/2026-06-08-smtp-submission/<p>You can now send emails through <strong>Cloudflare Email Service</strong> using authenticated <a href="https://developers.cloudflare.com/email-service/api/send-emails/smtp/">SMTP submission</a> on <code>smtp.mx.cloudflare.net:465</code>. SMTP joins the <a href="https://developers.cloudflare.com/email-service/api/send-emails/rest-api/">REST API</a> and the <a href="https://developers.cloudflare.com/email-service/api/send-emails/workers-api/">Workers binding</a> as a third way to send transactional email — useful for existing applications that already speak SMTP and language-native SMTP libraries (Nodemailer, <code>smtplib</code>, PHPMailer, JavaMail).</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Setting</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>Host</td> <td><code>smtp.mx.cloudflare.net</code></td> </tr> <tr> <td>Port</td> <td><code>465</code> (implicit TLS)</td> </tr> <tr> <td>AUTH</td> <td><code>PLAIN</code> or <code>LOGIN</code></td> </tr> <tr> <td>Username</td> <td><code>api_token</code></td> </tr> <tr> <td>Password</td> <td>A Cloudflare API token (account-owned or user-owned) with <strong>Email Sending: Edit</strong></td> </tr> </tbody> </table></div> <p>Submissions enter the same delivery pipeline as the REST API and Workers binding: identical <a href="https://developers.cloudflare.com/email-service/platform/limits/">limits</a>, automatic DKIM and ARC signing, and shared dashboard logs.</p> <p>Send your first email with a single command:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --ssl-reqd</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> "smtps://smtp.mx.cloudflare.net:465"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --user</span><span class="nb-shiki-mdbnqw"> "api_token:&lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --mail-from</span><span class="nb-shiki-mdbnqw"> "welcome@yourdomain.com"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --mail-rcpt</span><span class="nb-shiki-mdbnqw"> "user@example.com"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --upload-file</span><span class="nb-shiki-mdbnqw"> mail.txt</span></span></code></pre></figure> <p>Refer to the <a href="https://developers.cloudflare.com/email-service/api/send-emails/smtp/">SMTP reference</a> for authentication details, response codes, and language-specific examples.</p>Mon, 08 Jun 2026 00:00:00 GMTEmail ServiceEmail ServiceR2 SQL - R2 SQL now supports UNION, INTERSECT, EXCEPT, and SELECT DISTINCThttps://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/https://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/<p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> now supports set operations (<code>UNION</code>, <code>INTERSECT</code>, <code>EXCEPT</code>) and <code>SELECT DISTINCT</code>, expanding the range of analytical queries you can run directly on <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="set-operations">Set operations</h4><a class="anchor-link" href="#set-operations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Combine the results of multiple <code>SELECT</code> statements:</p> <ul> <li><strong><code>UNION</code></strong> — returns all rows from both queries, removing duplicates</li> <li><strong><code>UNION ALL</code></strong> — returns all rows from both queries, including duplicates</li> <li><strong><code>INTERSECT</code></strong> — returns only rows that appear in both queries</li> <li><strong><code>EXCEPT</code></strong> — returns rows from the first query that do not appear in the second</li> </ul> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Find zones that had either firewall blocks OR high-risk requests</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">firewall_events</span><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-1itgoe"> action</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'block'</span></span> <span class="line"><span class="nb-shiki-1itgoe">UNION</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">http_requests</span><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-140thh"> risk_score </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">8</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Find zones with both firewall blocks AND high traffic</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">firewall_events</span><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-1itgoe"> action</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'block'</span></span> <span class="line"><span class="nb-shiki-1itgoe">INTERSECT</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">http_requests</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> zone_id</span></span> <span class="line"><span class="nb-shiki-1itgoe">HAVING</span><span class="nb-shiki-dzsirb"> COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 10000</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Find enterprise zones that have not been compacted</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zones</span><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-140thh"> plan </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> 'enterprise'</span></span> <span class="line"><span class="nb-shiki-1itgoe">EXCEPT</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> zone_id </span><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">compaction_history</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="select-distinct">Select distinct</h4><a class="anchor-link" href="#select-distinct"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Eliminate duplicate rows from query results:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT DISTINCT</span><span class="nb-shiki-140thh"> region, department</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> total_amount </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 1000</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-140thh"> region, department</span></span> <span class="line"><span class="nb-shiki-1itgoe">LIMIT</span><span class="nb-shiki-dzsirb"> 100</span></span></code></pre></figure> <p>For large datasets where approximate results are acceptable, <code>approx_distinct()</code> remains a faster alternative for counting unique values.</p> <p>For the full syntax reference, refer to the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. For performance guidance, refer to <a href="https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/">Limitations and best practices</a>.</p>Mon, 08 Jun 2026 00:00:00 GMTR2 SQLR2 SQLRealtime - Post-meeting transcriptions are now Generally Available in RealtimeKithttps://developers.cloudflare.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/https://developers.cloudflare.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/<p><a href="https://developers.cloudflare.com/realtime/realtimekit/">RealtimeKit</a> lets you build products where people meet over live audio and video — such as HealthTech, EdTech, proctoring, and other real-time platforms — on Cloudflare's <a href="https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/">global WebRTC infrastructure</a>.</p> <p><a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#post-meeting-transcription">Post-meeting transcription</a> is now Generally Available, so completed RealtimeKit meetings can automatically produce full transcript files after they end. Those transcripts can also power <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/summary/">AI-generated summaries</a> for meeting notes, review workflows, and follow-up tasks after the transcript is available.</p> <p>Post-meeting transcription is a managed service powered by <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> using <a href="https://developers.cloudflare.com/workers-ai/models/whisper-large-v3-turbo/">Whisper Large v3 Turbo</a>. RealtimeKit handles transcription processing and can return transcript and summary files through <a href="https://developers.cloudflare.com/realtime/realtimekit/webhooks/">webhooks</a> or the REST API, so you do not need to run your own transcription infrastructure.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="generate-transcripts-and-summaries">Generate transcripts and summaries</h4><a class="anchor-link" href="#generate-transcripts-and-summaries"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To generate a transcript after a meeting ends, set <code>transcribe_on_end: true</code> when <a href="https://developers.cloudflare.com/api/resources/realtime_kit/subresources/meetings/methods/create/">creating a meeting</a>. To also generate an AI summary automatically after the transcript is available, set <code>summarize_on_end: true</code>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/meetings"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "title": "Weekly product review",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "transcribe_on_end": true,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "summarize_on_end": true,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ai_config": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "transcription": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "language": "en"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "summarization": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "word_limit": 500,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "text_format": "markdown",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "summary_type": "team_meeting"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="consume-results">Consume results</h4><a class="anchor-link" href="#consume-results"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When RealtimeKit finishes processing a meeting, it creates download URLs for the transcript and, if <code>summarize_on_end</code> is set, the summary. You can receive those URLs automatically with <a href="https://developers.cloudflare.com/realtime/realtimekit/webhooks/">webhooks</a>, or fetch them later for a specific session with the <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/summary/#rest-api">REST API</a>.</p> <p>To receive results as soon as they are ready, configure the <code>meeting.transcript</code> and <code>meeting.summary</code> webhook events:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/webhooks"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "name": "AI results webhook",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com/webhook",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "events": ["meeting.transcript", "meeting.summary"],</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "enabled": true</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>To fetch results later, call the <a href="https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_transcripts/">transcript</a> or <a href="https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_summary/">summary</a> endpoint for the session:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> GET</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/sessions/</span><span class="nb-shiki-140thh">$SESSION_ID</span><span class="nb-shiki-mdbnqw">/transcript"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> GET</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/sessions/</span><span class="nb-shiki-140thh">$SESSION_ID</span><span class="nb-shiki-mdbnqw">/summary"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <p>Use the <a href="https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/generate_summary_of_transcripts/">Generate summary of transcripts for the session</a> API only if <code>summarize_on_end</code> was not set and you want to generate a summary manually after the transcript is available:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-140thh">$APP_ID</span><span class="nb-shiki-mdbnqw">/sessions/</span><span class="nb-shiki-140thh">$SESSION_ID</span><span class="nb-shiki-mdbnqw">/summary"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <p>Post-meeting transcription supports <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#output-formats">CSV, JSON, SRT, and VTT transcript outputs</a>, <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#post-meeting-supported-languages">automatic language detection and Whisper language codes</a>. RealtimeKit also supports <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#real-time-transcription">real-time transcription</a> with <a href="https://developers.cloudflare.com/workers-ai/models/nova-3/">Deepgram Nova-3</a> for live captions, in-meeting accessibility, and real-time note-taking.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/">RealtimeKit transcription docs</a> and <a href="https://developers.cloudflare.com/realtime/realtimekit/ai/summary/">summary docs</a>.</p>Mon, 08 Jun 2026 00:00:00 GMTRealtimeRealtimeSecurity Center - Create WAF rules directly from Threat Events saved viewshttps://developers.cloudflare.com/changelog/post/2026-06-08-create-waf-rules-from-threat-events/https://developers.cloudflare.com/changelog/post/2026-06-08-create-waf-rules-from-threat-events/<p>Cloudforce One users can now turn <a href="https://developers.cloudflare.com/security-center/cloudforce-one/#analyze-threat-events">Threat Events indicators</a> into active defense. With this update, users can instantly generate a WAF rule that matches the dynamic list of IP addresses returned by any of their <strong>Saved Views</strong>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Threat intelligence is most effective when it is immediately actionable. Previously, blocking threat actors required manually extracting indicators from threat events and copying them into your firewall rules. This new integration bridges the gap between threat discovery and threat mitigation:</p> <ul> <li>When you identify an active threat pattern - such as an ongoing campaign targeting a specific industry, or using a known indicator type - you can pivot from investigation to mitigation in a single click.</li> <li>Instead of writing complex, static IP rules, this functionality allows you to leverage the specific filtering logic you have already defined and saved within your Threat Events ecosystem.</li> <li>Automating the generation of the WAF rule expression from your threat views eliminates manual copying errors, ensuring that the right malicious infrastructure is blocked instantly.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-use-it">How to use it</h4><a class="anchor-link" href="#how-to-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can implement these rules through both the dashboard UI and via the API / Terraform.</p> <p>Go to <strong>Cloudflare Dashboard</strong> &gt; <strong>Application Security</strong> &gt; <strong>Threat Intelligence</strong> &gt; <strong>Manage Views</strong>, select your desired view, and select <strong>Create WAF Rule</strong>.</p> <p>This will automatically pre-populate the <a href="https://developers.cloudflare.com/firewall/cf-dashboard/create-edit-delete-rules/">WAF rule builder</a> with the matching threat event IP indicators.</p> <p>You can also automate this workflow by utilizing the <a href="https://developers.cloudflare.com/firewall/api/cf-firewall-rules/"><strong>WAF Rule Builder API</strong></a> alongside your <a href="https://developers.cloudflare.com/firewall/api/cf-firewall-rules/">Threat Events saved views endpoints</a>.</p>Mon, 08 Jun 2026 00:00:00 GMTSecurity CenterSecurity CenterSecurity Center - Introducing Threat Actor Profiles in Threat Eventshttps://developers.cloudflare.com/changelog/post/2026-06-08-threat-actor-profiles/https://developers.cloudflare.com/changelog/post/2026-06-08-threat-actor-profiles/<p><strong>TL;DR:</strong> We’ve launched <strong>Threat Actor Profiles</strong> directly inside the Threat Events dashboard. You can now immediately pivot from a generic alert or blocked event to a profile that unmasks the "Who, Why, and How" behind a threat event.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Security teams often suffer from a visibility gap. When an attack is blocked, it's difficult to know if it was a random automated bot or a sophisticated advanced persistent threat (APT) campaign specifically targeting your industry. Finding out usually means leaving your security dashboard to hunt through external OSINT feeds or static, out-of-date threat reports. Threat Actor Profiles solve this by sharing Cloudforce One’s deep adversary research directly inside your workflow:</p> <ul> <li>Cloudflare sees the traffic in real-time across approximately 20% of the web. This means actor profiles display active malicious infrastructure the moment it touches our global edge.</li> <li>Every profile provides clear strategic and tactical modules including alternative aliases, origin tracking, historical threat event volume, and MITRE ATT&amp;CK mapping detailing the adversary's technical methods.</li> <li>You can search the dedicated threat actor directory or click an actor's name inside any threat event to view all details and related events to the specific threat actor.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-use-it">How to use it</h4><a class="anchor-link" href="#how-to-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Adversary tracking is now available in the Cloudflare Dashbboard and ready to be included in your daily investigation workflow:</p> <ul> <li>Click on the <strong>Threat Actor</strong> name in the Threat Events table to open their full identity profile and review their aliases and attack stats.</li> <li>Navigate to <strong>Cloudflare Dashboard &gt; Application Security &gt; Threat Intelligence</strong> to explore the new <strong>Threat Actors</strong> tab. Here, you can browse a card-based directory of all established entities tracked by Cloudforce One.</li> </ul> <p>Learn more in the <a href="https://developers.cloudflare.com/security-center/cloudforce-one/#identify-the-adversary" target="_blank" rel="noopener">Cloudforce One documentation<span class="external-link"> ↗</span></a>.</p>Mon, 08 Jun 2026 00:00:00 GMTSecurity CenterSecurity CenterWorkflows - Rollback support now available in Workflowshttps://developers.cloudflare.com/changelog/post/2026-06-05-saga-rollbacks/https://developers.cloudflare.com/changelog/post/2026-06-05-saga-rollbacks/ <p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> now supports saga-style rollbacks, allowing you to add compensating logic to each <code>step.do()</code> in case of downstream failures. If the instance fails, the rollback handlers will execute in reverse <code>step-start</code> order.</p> <p>This is useful for multi-step operations that touch external systems, such as inventory reservations, payment authorization, ticket creation, or infrastructure provisioning. Instead of writing all cleanup logic in a top-level <code>catch</code>, you can keep each compensating action next to the step it undoes.</p> <p>Rollback handlers support their own retry and timeout configuration, and Workflows now exposes rollback outcomes in instance status responses. Workflows analytics also emits rollback lifecycle events, making it easier to distinguish a forward execution failure from a rollback failure when debugging production workflows.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "provision resource"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> resource</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> provisionResource</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { resourceId: resource.id };</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> rollback</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">output</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">resourceId</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> output;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> deleteResource</span><span class="nb-shiki-140thh">(resourceId);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> rollbackConfig: {</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: { limit: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">, delay: </span><span class="nb-shiki-mdbnqw">"15 seconds"</span><span class="nb-shiki-140thh">, backoff: </span><span class="nb-shiki-mdbnqw">"linear"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"2 minutes"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "provision resource"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> resource</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> provisionResource</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { resourceId: resource.id };</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> rollback</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">output</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">resourceId</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> output </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-1jdh33">resourceId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> deleteResource</span><span class="nb-shiki-140thh">(resourceId);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> rollbackConfig: {</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: { limit: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">, delay: </span><span class="nb-shiki-mdbnqw">"15 seconds"</span><span class="nb-shiki-140thh">, backoff: </span><span class="nb-shiki-mdbnqw">"linear"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"2 minutes"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Refer to <a href="https://developers.cloudflare.com/workflows/build/workers-api/#rollback-options">rollback options</a> to learn more.</p>Fri, 05 Jun 2026 15:00:00 GMTWorkflowsWorkflowsAI Gateway - Control AI costs with spend limitshttps://developers.cloudflare.com/changelog/post/2026-06-05-spend-limits/https://developers.cloudflare.com/changelog/post/2026-06-05-spend-limits/<p>AI Gateway now supports spend limits — cost-based budgets that track cumulative dollar spend and block requests when the budget is exceeded. Unlike rate limiting, which caps the number of requests, spend limits track actual cost based on token usage and model pricing.</p> <p>You can scope limits by model, provider, or custom metadata dimensions. For example, give each user a $200/day budget, cap total gateway spend at $10,000/day, or limit a specific model to $50/day per user. Each rule uses a configurable time window with fixed or sliding enforcement.</p> <p>Spend limits work with both <a href="https://developers.cloudflare.com/ai-gateway/features/unified-billing/">Unified Billing</a> and <a href="https://developers.cloudflare.com/ai-gateway/configuration/bring-your-own-keys/">BYOK</a> requests for models with known pricing.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/ai-gateway/features/spend-limits/">Spend limits documentation</a>.</p>Fri, 05 Jun 2026 00:00:00 GMTAI GatewayAI GatewayRadar - Finer-grained chart granularity on Cloudflare Radar for longer time rangeshttps://developers.cloudflare.com/changelog/post/2026-06-05-radar-traffic-chart-granularity/https://developers.cloudflare.com/changelog/post/2026-06-05-radar-traffic-chart-granularity/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now provides finer-grained traffic charts for longer time ranges. Previously, selecting a 1-3 month view on HTTP and NetFlows charts defaulted to weekly aggregation, which was too coarse to surface meaningful trends. Views longer than 3 months defaulted to monthly aggregation, returning as few as 7 data points for a 6-month range.</p> <p>The new defaults are:</p> <ul> <li><strong>1-3 months</strong>: daily granularity (7x more data points)</li> <li><strong>Longer than 3 months</strong> (HTTP and NetFlows): weekly granularity (4x more data points)</li> </ul> <p>For example, a 12-week traffic view previously showed weekly data:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/traffic-granularity-12w-before.OlJmS6Ts.png" alt="Traffic trends chart with weekly granularity for a 12-week view" loading="lazy" decoding="async" width="1600" height="878"> <p>The same view now shows daily data:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/traffic-granularity-12w-after.DL8mxwQ3.png" alt="Traffic trends chart with daily granularity for a 12-week view" loading="lazy" decoding="async" width="1600" height="878"> <p>Similarly, a 1-year HTTP traffic view that previously showed just 12 monthly data points now provides 52 weekly data points.</p> <p>Visit <a href="https://radar.cloudflare.com/?dateRange=12w#traffic-trends" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a> to explore the new granular views.</p>Fri, 05 Jun 2026 00:00:00 GMTRadarRadarGateway, Cloudflare Mesh, Workers VPC - Filter Workers' public Internet traffic using Gateway policieshttps://developers.cloudflare.com/changelog/post/2026-06-05-gateway-egress/https://developers.cloudflare.com/changelog/post/2026-06-05-gateway-egress/ <p>Workers using a <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Network</a> binding with <code>network_id: "cf1:network"</code> now egress to public Internet destinations through <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a>. This means your existing Zero Trust traffic policies — DNS, HTTP, Network, and egress — extend to traffic that originates from your Workers, the same way they do for WARP users today.</p> <figure class="vpc-egress-diagram not-content" aria-label="Workers VPC public Internet egress through Cloudflare Mesh and Cloudflare Gateway" data-astro-cid-lmo6yva7><ol class="flow" data-astro-cid-lmo6yva7><li class="flow-step" data-astro-cid-lmo6yva7><div class="node-card worker-card" data-astro-cid-lmo6yva7><div class="node-header" data-astro-cid-lmo6yva7><span class="node-icon worker-icon" aria-hidden="true" data-astro-cid-lmo6yva7><svg width="0.98em" height="1em" viewBox="0 0 48 49" data-astro-cid-lmo6yva7="true" data-icon="workers"><path fill="currentColor" d="m18.63 37.418-9.645-12.9 9.592-12.533-1.852-2.527L5.917 23.595l-.015 1.808 10.86 14.542z"/><path fill="currentColor" d="M21.997 6.503h-3.712l13.387 18.3-13.072 17.7h3.735L35.4 24.81z"/><path fill="currentColor" d="M29.175 6.503h-3.758l13.598 18.082-13.598 17.918h3.765l12.908-17.01v-1.808z"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/workers/" data-astro-cid-lmo6yva7>Worker</a></div><p class="node-caption" data-astro-cid-lmo6yva7>Calls <code data-astro-cid-lmo6yva7>env.EGRESS.fetch()</code></p></div></li><li class="flow-connector" data-astro-cid-lmo6yva7><a class="connector-label" href="https://developers.cloudflare.com/workers-vpc/" data-astro-cid-lmo6yva7>VPC binding</a><span class="connector-arrow" aria-hidden="true" data-astro-cid-lmo6yva7>↓</span></li><li class="flow-step" data-astro-cid-lmo6yva7><div class="node-card mesh-card" data-astro-cid-lmo6yva7><div class="node-header" data-astro-cid-lmo6yva7><span class="node-icon mesh-icon" aria-hidden="true" data-astro-cid-lmo6yva7><svg width="1em" height="1em" viewBox="0 0 32 32" data-astro-cid-lmo6yva7="true" data-icon="cloudflare-mesh"><path fill="currentColor" d="M10 6a2 2 0 1 1-4 0 2 2 0 0 1 4 0m6-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 4a2 2 0 1 0 0-4 2 2 0 0 0 0 4M8 11a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4M8 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4m0 7a2 2 0 1 0 0 4 2 2 0 0 0 0-4m8-7a2 2 0 1 0 0 4 2 2 0 0 0 0-4"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/" data-astro-cid-lmo6yva7>Cloudflare Mesh</a></div><p class="node-caption" data-astro-cid-lmo6yva7>Bind via <a class="inline-pill mesh-pill" href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/" data-astro-cid-lmo6yva7><code data-astro-cid-lmo6yva7>cf1:network</code></a></p></div></li><li class="flow-connector" aria-hidden="true" data-astro-cid-lmo6yva7><span class="connector-arrow" data-astro-cid-lmo6yva7>↓</span></li><li class="flow-step" data-astro-cid-lmo6yva7><div class="node-card gateway-card" data-astro-cid-lmo6yva7><div class="node-header" data-astro-cid-lmo6yva7><span class="node-icon gateway-icon" aria-hidden="true" data-astro-cid-lmo6yva7><svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-lmo6yva7="true" data-icon="gateway"><path fill="currentColor" d="M15.45 7.125h-2.577V3.508l-.41-.408H3.925l-.41.41v3.08h.922V4.023h7.513v7.555H4.438v-1.553h-.923v2.065l.41.41h8.538l.41-.41V8.048H16z"/><path fill="currentColor" d="M8.453 7.238H0l.517.87H8.97zM9.21 8.51H.755l.517.868h8.453z"/></svg></span><a class="node-title" href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/" data-astro-cid-lmo6yva7>Cloudflare Gateway</a></div><p class="node-caption" data-astro-cid-lmo6yva7>Policies applied:</p><div class="pill-row" data-astro-cid-lmo6yva7><a class="policy-pill" href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/" data-astro-cid-lmo6yva7>DNS</a><a class="policy-pill" href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/" data-astro-cid-lmo6yva7>HTTP</a><a class="policy-pill" href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/" data-astro-cid-lmo6yva7>Network</a></div></div></li><li class="flow-connector" aria-hidden="true" data-astro-cid-lmo6yva7><span class="connector-arrow" data-astro-cid-lmo6yva7>↓</span></li><li class="flow-step" data-astro-cid-lmo6yva7><div class="node-card internet-card" data-astro-cid-lmo6yva7><div class="node-header" data-astro-cid-lmo6yva7><span class="node-icon internet-icon" aria-hidden="true" data-astro-cid-lmo6yva7>↗</span><span class="node-title" data-astro-cid-lmo6yva7>Public Internet</span></div><p class="node-caption" data-astro-cid-lmo6yva7>Any public hostname or IP</p></div></li></ol><a class="logs-card" href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/" aria-label="Gateway logs" data-astro-cid-lmo6yva7><span class="logs-title" data-astro-cid-lmo6yva7>Gateway logs</span><span class="logs-pills" data-astro-cid-lmo6yva7><span class="logs-pill" data-astro-cid-lmo6yva7>DNS</span><span class="logs-pill" data-astro-cid-lmo6yva7>HTTP</span><span class="logs-pill" data-astro-cid-lmo6yva7>Network</span></span></a></figure> <p>What you get by default:</p> <ul> <li><strong>Visibility.</strong> Worker egress shows up in Gateway <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/">DNS</a>, <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP</a>, and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network</a> logs alongside your other traffic, so you can audit what your Workers are calling and when.</li> <li><strong>Enforcement.</strong> Any existing Gateway policy whose selectors match a Worker request will apply — including allow / block lists, DNS category filtering, and HTTP destination rules. If you have already blocked a category for your workforce, your Workers inherit that block.</li> </ul> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "vpc_networks"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"EGRESS"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "network_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf1:network"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">vpc_networks</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"EGRESS"</span></span> <span class="line"><span class="nb-shiki-140thh">network_id = </span><span class="nb-shiki-mdbnqw">"cf1:network"</span></span> <span class="line"><span class="nb-shiki-140thh">remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script><div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Egress to a public destination — subject to your Gateway policies and logged</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EGRESS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://api.example.com/data"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Egress to a public destination — subject to your Gateway policies and logged</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EGRESS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://api.example.com/data"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div></div> <p>For configuration options, refer to <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Networks</a>. For policy authoring, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway traffic policies</a>.</p>Fri, 05 Jun 2026 00:00:00 GMTGatewayGatewayCloudflare MeshWorkers VPCAccess - Share identity providers across accounts with IdP federationhttps://developers.cloudflare.com/changelog/post/2026-06-04-idp-federation/https://developers.cloudflare.com/changelog/post/2026-06-04-idp-federation/<p>Cloudflare Access now supports <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/idp-federation/">IdP federation</a>, which allows organizations to share a single identity provider across multiple Cloudflare accounts.</p> <p>Instead of configuring the same IdP (for example, Okta or Entra ID) separately in every account, you configure it once in a source account and share it with the other accounts in your organization. Each recipient account gets a read-only IdP connection that routes authentication back to the source account through a bridge — a hidden application in the source account that brokers the cross-account login. End users sign in with their existing IdP credentials, and each account's Access policies evaluate the resulting identity just like any other IdP login.</p> <p>Key capabilities:</p> <ul> <li><strong>One IdP, many accounts</strong> — Configure your IdP once and share it with all accounts in your organization.</li> <li><strong>Lifecycle management</strong> — As accounts join or leave your Cloudflare organization, their IdP connections are provisioned and removed automatically — no manual cleanup required.</li> <li><strong>Immutable recipient connections</strong> — IdP connections in recipient accounts cannot be accidentally modified or deleted.</li> </ul> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/idp-federation/">IdP federation</a>.</p>Thu, 04 Jun 2026 00:00:00 GMTAccessAccessCloudflare Fundamentals, Workers, D1, R2, KV, Queues, Vectorize, Durable Objects, Containers - Billable usage and budget alerts now in product sidebarshttps://developers.cloudflare.com/changelog/post/2026-06-04-billable-usage-product-sidebar/https://developers.cloudflare.com/changelog/post/2026-06-04-billable-usage-product-sidebar/<p>Pay-as-you-go customers can now view billable usage and create <a href="https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/">budget alerts</a> directly from the product overview pages for <a href="https://developers.cloudflare.com/workers/">Workers &amp; Pages</a>, <a href="https://developers.cloudflare.com/d1/">D1</a>, <a href="https://developers.cloudflare.com/r2/">R2</a>, <a href="https://developers.cloudflare.com/kv/">Workers KV</a>, <a href="https://developers.cloudflare.com/queues/">Queues</a>, <a href="https://developers.cloudflare.com/vectorize/">Vectorize</a>, <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>, and <a href="https://developers.cloudflare.com/containers/">Containers</a>. A new sidebar widget shows current-period spend and the billing cycle date range, alongside a button to create a budget alert.</p> <p>The widget pulls from the same data as the <a href="https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/">Billable Usage dashboard</a> and aligns to your billing cycle (or the current day on Free plans), so the numbers match your invoice. Enterprise contract accounts are not yet supported.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2872,height=1614,format=webp/_astro/2026-06-04-billable-usage-product-sidebar.BUuIokn_.png" alt="Billable usage widget in the Durable Objects product sidebar showing current-period spend and a breakdown by service" loading="lazy" decoding="async" width="2872" height="1614"> <p>Selecting <strong>Create budget alert</strong> opens the budget alert flow inline so you can set a dollar threshold in the same place you are reviewing usage. Budget alerts apply to your total account-level spend across all products, not just the product page you create them from.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/billing/">Usage-based billing documentation</a>.</p>Thu, 04 Jun 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWorkersD1R2KVQueuesVectorizeDurable ObjectsContainersPipelines, Workers - Pipeline binding configuration field renamed to streamhttps://developers.cloudflare.com/changelog/post/2026-05-27-pipeline-binding-stream-field/https://developers.cloudflare.com/changelog/post/2026-05-27-pipeline-binding-stream-field/ <p>The <code>pipeline</code> field inside the <code>pipelines</code> binding configuration in your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">Wrangler configuration file</a> has been renamed to <code>stream</code>. The old field is deprecated but still accepted.</p> <p>Update your configuration to use <code>stream</code> to avoid the deprecation warning.</p> <p><strong>Before (deprecated):</strong></p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pipelines"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_PIPELINE"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pipeline"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;STREAM_ID>"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">pipelines</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"MY_PIPELINE"</span></span> <span class="line"><span class="nb-shiki-140thh">pipeline = </span><span class="nb-shiki-mdbnqw">"&#x3C;STREAM_ID>"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p><strong>After:</strong></p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pipelines"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_PIPELINE"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "stream"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;STREAM_ID>"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">pipelines</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"MY_PIPELINE"</span></span> <span class="line"><span class="nb-shiki-140thh">stream = </span><span class="nb-shiki-mdbnqw">"&#x3C;STREAM_ID>"</span></span></code></pre></figure></div></div></div> <p>No other changes are required. The binding name, TypeScript types, and runtime API (<code>env.MY_PIPELINE.send(...)</code>) remain the same.</p> <p>For more information on configuring pipeline bindings, refer to <a href="https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#configure-pipeline-binding">Writing to streams</a>.</p>Thu, 04 Jun 2026 00:00:00 GMTPipelinesPipelinesWorkersAccess - SAML assertion encryption for identity providershttps://developers.cloudflare.com/changelog/post/2026-06-03-saml-assertion-encryption/https://developers.cloudflare.com/changelog/post/2026-06-03-saml-assertion-encryption/<p>Cloudflare Access now supports SAML assertion encryption for identity provider integrations. When turned on, your identity provider encrypts SAML assertions using a Cloudflare-managed certificate before sending them through the user's browser. Only Access can decrypt these assertions, protecting sensitive identity data even after TLS termination.</p> <p>Without encryption, SAML assertions are transmitted in plaintext and could be visible to browser extensions or client-side malware.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1698,height=344,format=webp/_astro/saml-encryption.J5jmiYv8.png" alt="SAML encryption toggle in the identity provider configuration" loading="lazy" decoding="async" width="1698" height="344"> <p>SAML encryption includes built-in certificate lifecycle management:</p> <ul> <li><strong>Automatic certificate generation</strong>: Access generates an encryption certificate when you turn on SAML encryption for an identity provider.</li> <li><strong>Certificate rotation</strong>: Rotate certificates without downtime. The previous certificate remains valid until expiration, giving you time to update your IdP.</li> <li><strong>PEM export</strong>: Copy the certificate in PEM format for manual upload to your IdP, or point your IdP to the SAML metadata endpoint for automatic retrieval.</li> </ul> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/generic-saml/#encrypt-saml-assertions">Encrypt SAML assertions</a>.</p>Wed, 03 Jun 2026 00:00:00 GMTAccessAccessCloudflare Fundamentals - Introducing self-managed OAuth clientshttps://developers.cloudflare.com/changelog/post/2026-06-03-public-oauth-clients/https://developers.cloudflare.com/changelog/post/2026-06-03-public-oauth-clients/ <p>Today we are launching self-managed OAuth, enabling developers to build third-party applications that integrate with Cloudflare via OAuth. This provides a more secure, user-friendly, and manageable alternative to API tokens.</p> <p>OAuth lets third-party applications act on behalf of a user to access their Cloudflare account. For example, after a user grants consent, Wrangler can deploy Workers into that account.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-new">What is new</h4><a class="anchor-link" href="#what-is-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare Developers can now create and manage their own OAuth applications to integrate with Cloudflare.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="create-an-application">Create an application</h4><a class="anchor-link" href="#create-an-application"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To create an application, go to <strong>Manage account</strong> &gt; <strong>OAuth clients</strong> in your account on the Cloudflare dashboard.</p> <a href="https://dash.cloudflare.com/?to=/:account/oauth-clients" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>OAuth clients</strong>&nbsp;&#8599;</a> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="select-limited-scopes">Select limited scopes</h4><a class="anchor-link" href="#select-limited-scopes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you have used an API token to call Cloudflare APIs, OAuth client scopes will look familiar. Select only the scopes your application needs during application creation, and include that scope list when sending users to Cloudflare for consent.</p> <p>Users can review the requested scopes before they consent.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="apps-for-both-private-and-public-use">Apps for both private and public use</h4><a class="anchor-link" href="#apps-for-both-private-and-public-use"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Applications start with <code>private</code> visibility. Private applications can only be used by members of the account where the application was created.</p> <p>To make an application available to any Cloudflare user, complete the prerequisites for <code>public</code> visibility.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/oauth/create-an-oauth-client/#private-and-public-clients">client visibility</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="client-domain-verification">Client domain verification</h4><a class="anchor-link" href="#client-domain-verification"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Before an application can be made public, you must verify the client domain. Domain verification helps users confirm that the application owner controls the domain shown on the consent page.</p> <p>After verification, users see a verified badge on the consent page.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/oauth/create-an-oauth-client/#client-url-domain-ownership-verification">domain verification</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/oauth/">OAuth clients</a>.</p>Wed, 03 Jun 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWorkers - New Workers bulk secrets API endpointhttps://developers.cloudflare.com/changelog/post/2026-06-03-bulk-secrets-api/https://developers.cloudflare.com/changelog/post/2026-06-03-bulk-secrets-api/<p>You can now create, update, or delete multiple secrets for your Worker in a single request using the <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/secrets/methods/bulk_update/">bulk secrets endpoint</a>.</p> <ul> <li>Include a secret with a value to create or update.</li> <li>Set a secret to <code>null</code> to delete.</li> <li>Secrets not included in the request are left unchanged.</li> </ul> <p>The following example creates <code>API_KEY</code>, updates the already existing <code>DB_PASSWORD</code>, and deletes <code>OLD_SECRET</code>:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "secrets"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "API_KEY"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"secret_text"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"API_KEY"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"text"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-api-key"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "DB_PASSWORD"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"secret_text"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"DB_PASSWORD"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"text"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-db-password"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "OLD_SECRET"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">null</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>You can do the same from the command line using <a href="https://developers.cloudflare.com/workers/wrangler/commands/workers/#secret-bulk"><code>wrangler secret bulk</code></a>:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> secret</span><span class="nb-shiki-mdbnqw"> bulk</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw"> secrets.json</span></span></code></pre></figure> <p>To delete a key, set its value to <code>null</code> in the JSON file. Deletion is not supported with <code>.env</code> files.</p> <p>Each request supports up to <strong>100 total operations</strong> (creates, updates, and deletes combined).</p>Wed, 03 Jun 2026 00:00:00 GMTWorkersWorkersWorkers - Store Wrangler's OAuth credentials in your OS keychainhttps://developers.cloudflare.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/https://developers.cloudflare.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/<p><a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> can now store the OAuth credentials returned by <code>wrangler login</code> in an <a href="https://en.wikipedia.org/wiki/Galois/Counter_Mode" target="_blank" rel="noopener">AES-256-GCM<span class="external-link"> ↗</span></a>-encrypted file, with the encryption key held in your operating system keychain. The default behavior is unchanged — credentials still live in a plaintext TOML file unless you opt in.</p> <p>To opt in, run:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> login</span><span class="nb-shiki-dzsirb"> --use-keyring</span></span></code></pre></figure> <p>The choice is persisted across Wrangler invocations. Opt back out with <code>npx wrangler login --no-use-keyring</code>, or override the preference for a single command with the <code>CLOUDFLARE_AUTH_USE_KEYRING</code> environment variable.</p> <p><code>wrangler whoami</code> now reports where credentials are stored:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">🔐</span><span class="nb-shiki-mdbnqw"> Credentials</span><span class="nb-shiki-mdbnqw"> are</span><span class="nb-shiki-mdbnqw"> stored</span><span class="nb-shiki-mdbnqw"> in:</span><span class="nb-shiki-mdbnqw"> Encrypted</span><span class="nb-shiki-mdbnqw"> file</span><span class="nb-shiki-140thh"> (~/.config/.wrangler/config/default.enc) with key in macOS Keychain (service</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">wrangler,</span><span class="nb-shiki-140thh"> account</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">default</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>Per-platform backends:</p> <ul> <li><strong>macOS</strong> uses the built-in Keychain via <code>/usr/bin/security</code>.</li> <li><strong>Linux</strong> uses <a href="https://wiki.gnome.org/Projects/Libsecret" target="_blank" rel="noopener">libsecret<span class="external-link"> ↗</span></a> via the <code>secret-tool</code> CLI from the <code>libsecret-tools</code> package.</li> <li><strong>Windows</strong> uses Credential Manager via <a href="https://www.npmjs.com/package/@napi-rs/keyring" target="_blank" rel="noopener"><code>@napi-rs/keyring</code><span class="external-link"> ↗</span></a>, installed on-demand the first time you opt in.</li> </ul> <p>Refer to <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#storing-oauth-credentials-in-the-os-keychain">Storing OAuth credentials in the OS keychain</a> for the full details, including the migration behavior on opt-in/opt-out and the <code>CLOUDFLARE_AUTH_USE_KEYRING</code> environment variable.</p>Wed, 03 Jun 2026 00:00:00 GMTWorkersWorkersWorkflows, Workers - Schedule Workflow instances directly from your Workflow bindinghttps://developers.cloudflare.com/changelog/post/2026-06-02-cron-workflows/https://developers.cloudflare.com/changelog/post/2026-06-02-cron-workflows/<p>You can now attach cron schedules directly to a Workflow binding in <code>wrangler.jsonc</code>. Each scheduled run creates a new Workflow instance automatically, so you do not need to define a separate Worker with a <code>scheduled</code> handler just to trigger your Workflow on an interval.</p> <p>For example, you can configure hourly, every-15-minute, or weekday schedules on the same Workflow:</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "workflows"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-scheduled-workflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_WORKFLOW"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "class_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MyScheduledWorkflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "schedules"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"0 * * * *"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"*/15 * * * *"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"0 9 * * MON-FRI"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Cron workloads get all the same benefits of Workflows with built-in retries, multi-step durable execution, and configurable timeouts of Workflows.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowEntrypoint,</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowEvent,</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowStep,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Runs automatically on each cron schedule defined for the MY_WORKFLOW binding in wrangler.jsonc.</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyScheduledWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkflowEntrypoint</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowEvent</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowStep</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"fetch source data"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetchSourceData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // If this step fails, only this step is retried with the custom logic below</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "process and store results"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: { limit: </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">, delay: </span><span class="nb-shiki-mdbnqw">"30 seconds"</span><span class="nb-shiki-140thh">, backoff: </span><span class="nb-shiki-mdbnqw">"exponential"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"10 minutes"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> processAndStore</span><span class="nb-shiki-140thh">(data);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>This makes it easier to build recurring, scheduled jobs such as database backups, invoice generation, report aggregation, and cleanup tasks without wiring up a separate Cron Trigger entrypoint.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/workflows/build/trigger-workflows/">Trigger Workflows</a>.</p>Tue, 02 Jun 2026 15:00:00 GMTWorkflowsWorkflowsWorkersAgents, Workers - Agents SDK v0.14.0: Agent Skills, messengers, scheduled tasks, Workflows, and hardened chat recoveryhttps://developers.cloudflare.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/https://developers.cloudflare.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> adds four new ways to build with <code>@cloudflare/think</code>: on-demand Agent Skills, chat messengers (starting with Telegram), declarative scheduled tasks, and durable reasoning steps inside Workflows. This release also significantly hardens durable chat recovery, so turns reliably ride through deploys, evictions, and stalled model streams in production.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agent-skills-experimental">Agent Skills (experimental)</h4><a class="anchor-link" href="#agent-skills-experimental"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Give an agent a catalog of on-demand instructions, resources, and scripts. A skill source adds a catalog to the system prompt, and the model activates a skill only when a task matches — so a large library of capabilities does not bloat every prompt.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think, skills } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> bundledSkills </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents:skills"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> SkillsAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getSkills</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> [</span></span> <span class="line"><span class="nb-shiki-140thh"> bundledSkills,</span></span> <span class="line"><span class="nb-shiki-140thh"> skills.</span><span class="nb-shiki-1t8gfj">r2</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">SKILLS_BUCKET</span><span class="nb-shiki-140thh">, { prefix: </span><span class="nb-shiki-mdbnqw">"skills/"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ];</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think, skills } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> bundledSkills </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents:skills"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> SkillsAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getSkills</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> [</span></span> <span class="line"><span class="nb-shiki-140thh"> bundledSkills,</span></span> <span class="line"><span class="nb-shiki-140thh"> skills.</span><span class="nb-shiki-1t8gfj">r2</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">SKILLS_BUCKET</span><span class="nb-shiki-140thh">, { prefix: </span><span class="nb-shiki-mdbnqw">"skills/"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ];</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>The <code>agents:skills</code> import bundles a local <code>./skills</code> directory through the Agents Vite plugin (one directory per skill, each with a <code>SKILL.md</code>). Skills can also load from R2 or a manifest. When skills are available, Think exposes <code>activate_skill</code>, <code>read_skill_resource</code>, and an optional <code>run_skill_script</code> tool. Skill loading is resilient: a duplicate or failing source is skipped with a warning instead of breaking the agent.</p> <p>Agent Skills are <strong>experimental</strong>, and script execution in particular is early. The API may change in a future release. We would love your feedback — tell us what you are building and what is missing in the <a href="https://github.com/cloudflare/agents/discussions" target="_blank" rel="noopener">Agents repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="messengers">Messengers</h4><a class="anchor-link" href="#messengers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Connect a Think agent directly to a chat platform. Think owns the webhook route, conversation routing, durable reply fiber, and streamed delivery back to the provider. Telegram ships as the first provider.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> defineMessengers,</span></span> <span class="line"><span class="nb-shiki-140thh"> ThinkMessengerStateAgent,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/messengers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> telegramMessenger </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/messengers/telegram"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-140thh"> { ThinkMessengerStateAgent };</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> SupportAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getMessengers</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> defineMessengers</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> telegram: </span><span class="nb-shiki-1t8gfj">telegramMessenger</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> token: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">TELEGRAM_BOT_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> userName: </span><span class="nb-shiki-mdbnqw">"support_bot"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> secretToken: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">TELEGRAM_WEBHOOK_SECRET_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> defineMessengers,</span></span> <span class="line"><span class="nb-shiki-140thh"> ThinkMessengerStateAgent,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/messengers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> telegramMessenger </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/messengers/telegram"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-140thh"> { ThinkMessengerStateAgent };</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> SupportAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getMessengers</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> defineMessengers</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> telegram: </span><span class="nb-shiki-1t8gfj">telegramMessenger</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> token: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">TELEGRAM_BOT_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> userName: </span><span class="nb-shiki-mdbnqw">"support_bot"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> secretToken: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">TELEGRAM_WEBHOOK_SECRET_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Each Chat SDK thread maps to its own Think sub-agent by default, so group chats and direct messages do not share memory. Multiple bots, custom conversation routing, and custom providers are all supported.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="scheduled-tasks">Scheduled tasks</h4><a class="anchor-link" href="#scheduled-tasks"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Declare recurring, timezone-aware prompts and handlers with a typed domain-specific language (DSL). Think reconciles the declarations on startup and re-arms the next occurrence after each run, backed by durable idempotent submissions.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think, defineScheduledTasks } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> DigestAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getScheduledTasks</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> defineScheduledTasks</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> weeklyCommitReport: {</span></span> <span class="line"><span class="nb-shiki-140thh"> schedule: </span><span class="nb-shiki-mdbnqw">"every week on monday at 09:00"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt:</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Compile my GitHub commits for the last week and summarize them."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> workout: {</span></span> <span class="line"><span class="nb-shiki-140thh"> schedule: </span><span class="nb-shiki-mdbnqw">"every day at 08:00 in Europe/London"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"Start my workout."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think, defineScheduledTasks } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> DigestAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getScheduledTasks</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> defineScheduledTasks</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> weeklyCommitReport: {</span></span> <span class="line"><span class="nb-shiki-140thh"> schedule: </span><span class="nb-shiki-mdbnqw">"every week on monday at 09:00"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt:</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Compile my GitHub commits for the last week and summarize them."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> workout: {</span></span> <span class="line"><span class="nb-shiki-140thh"> schedule: </span><span class="nb-shiki-mdbnqw">"every day at 08:00 in Europe/London"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"Start my workout."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="think-workflows">Think Workflows</h4><a class="anchor-link" href="#think-workflows"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Run a model-driven reasoning step inside a Cloudflare Workflow with <code>ThinkWorkflow</code> and <code>step.prompt()</code>, with durable typed structured output, long waits, and approval gates.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { ThinkWorkflow } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> draftSchema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> title: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> summary: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> labels: z.</span><span class="nb-shiki-1t8gfj">array</span><span class="nb-shiki-140thh">(z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">()),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> TriageWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> ThinkWorkflow</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> draft</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">prompt</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"triage-issue"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">`Triage issue #${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">issueNumber</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> output: draftSchema,</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"3 days"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"apply-labels"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.agent.</span><span class="nb-shiki-1t8gfj">applyLabels</span><span class="nb-shiki-140thh">(draft.labels);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { ThinkWorkflow } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { ThinkWorkflowStep } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { AgentWorkflowEvent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> draftSchema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> title: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> summary: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> labels: z.</span><span class="nb-shiki-1t8gfj">array</span><span class="nb-shiki-140thh">(z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">()),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> TriageWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> ThinkWorkflow</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">TriageAgent</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">Params</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> AgentWorkflowEvent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Params</span><span class="nb-shiki-140thh">&gt;, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ThinkWorkflowStep</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> draft</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">prompt</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"triage-issue"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">`Triage issue #${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">issueNumber</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> output: draftSchema,</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"3 days"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"apply-labels"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.agent.</span><span class="nb-shiki-1t8gfj">applyLabels</span><span class="nb-shiki-140thh">(draft.labels);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="production-hardening-for-durable-chat-recovery">Production hardening for durable chat recovery</h4><a class="anchor-link" href="#production-hardening-for-durable-chat-recovery"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Durable chat turns have always been designed to survive a mid-turn deploy or Durable Object eviction. This release is a major hardening pass on that machinery for production.</p> <ul> <li><strong>Better recovery during deploys.</strong> Turns now ride through continuous deploys and evictions without losing completed work or re-running tools that already ran.</li> <li><strong>A live "recovering…" signal.</strong> <code>useAgentChat</code> exposes a new <code>isRecovering</code> flag, so a recovering turn shows progress instead of looking frozen. Most UIs render <code>isStreaming || isRecovering</code> as "busy".</li> <li><strong>Stalled streams recover.</strong> Set <code>chatStreamStallTimeoutMs</code> to route a hung provider stream into the same recovery path instead of leaving an infinite spinner.</li> <li><strong>Sub-agents re-attach.</strong> On parent recovery, an in-flight <code>agentTool()</code> child is re-attached to its result rather than abandoned and re-run, so long-running children no longer lose work under deploys.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-transport-improvements">MCP transport improvements</h4><a class="anchor-link" href="#mcp-transport-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Resumable streams</strong> — In-flight tool calls over Server-Sent Events (SSE) survive a dropped connection. Clients reconnect with <code>Last-Event-ID</code> and replay anything they missed.</li> <li><strong>Readable server IDs</strong> — <code>addMcpServer</code> accepts an optional <code>id</code>, so tools surface as readable keys (for example <code>tool_github_create_pull_request</code>) instead of opaque connection IDs.</li> <li><strong>Better handling of concurrent requests</strong> — Overlapping JSON-RPC requests are now correctly correlated to their responses across the HTTP and RPC transports.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Compaction</strong> — A <code>Session</code>'s <code>tokenCounter</code> now also drives the compaction boundary decision ("what to compress"), not just the fire/no-fire trigger.</li> <li><strong><code>@cloudflare/worker-bundler</code></strong> — Adds a <code>virtualModules</code> option to <code>createWorker</code> to provide in-memory module source during bundling.</li> <li><strong>Client-tool continuations</strong> — Parallel tool results now coalesce into a single continuation, immediate resume requests attach to the pending continuation, and server-side <code>needsApproval</code> continuations resume reliably after approval.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-npm" id="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-yarn" id="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-pnpm" id="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-bun" id="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-npm" aria-labelledby="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-yarn" aria-labelledby="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-pnpm" aria-labelledby="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-bun" aria-labelledby="pm-tab-pm-2776b26c-880a-45fa-ba4c-bef358fe6f18-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Refer to the <a href="https://developers.cloudflare.com/agents/runtime/">Agents API reference</a> and <a href="https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/">Chat agents documentation</a> for more information.</p>Tue, 02 Jun 2026 00:00:00 GMTAgentsAgentsWorkersCloudflare WAN, Cloudflare One - Cisco IOS XEhttps://developers.cloudflare.com/changelog/post/2026-06-02-cisco-ios-xe/https://developers.cloudflare.com/changelog/post/2026-06-02-cisco-ios-xe/<p>The Cisco IOS XE third-party integration guide for Cloudflare WAN has been updated to include:</p> <ul> <li>Post Quantum Cryptography (PQC)</li> <li>Policy-Based Routing (PBR)</li> <li>IP Service Level Agreement (IP SLA)</li> </ul> <p>This link will take you directly to the updated <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/third-party/cisco-ios-xe/">Cisco IOS XE</a> guide.</p>Tue, 02 Jun 2026 00:00:00 GMTCloudflare WANCloudflare WANCloudflare OneLogs - New Turnstile Events Logpush dataset in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2026-06-01-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-06-01-log-fields-updated/<p>Cloudflare has updated <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-datasets">New datasets</h4><a class="anchor-link" href="#new-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Turnstile Events</strong>: A new dataset with fields including <code>ASN</code>, <code>Action</code>, <code>BrowserMajor</code>, <code>BrowserName</code>, <code>ClientIP</code>, <code>CountryCode</code>, <code>EventType</code>, <code>Hostname</code>, <code>OSMajor</code>, <code>OSName</code>, <code>Sitekey</code>, <code>Timestamp</code>, and <code>UserAgent</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Mon, 01 Jun 2026 00:00:00 GMTLogsLogsCloudflare One Client - Cloudflare One Client for macOS (version 2026.5.1155.1)https://developers.cloudflare.com/changelog/post/2026-05-29-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2026-05-29-warp-macos-beta/<p>A new Beta release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>The client now applies DNS search suffixes configured in your <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles">device profile</a> / <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies">network policy</a>. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search suffixes</a> for details.</li> <li>Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#vnet-availability">VNET availability</a> for details.</li> <li>Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.</li> <li>Added new warp-cli debug commands for interactive connection diagnosis. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging">Extra debug logging</a> for details.</li> <li>The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.</li> <li>Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs">Cloudflare One MDM documentation</a> for details.</li> <li>Client Certificate device-posture checks now support template variables (e.g. <code>${serial_number}</code>, <code>${device_uuid}</code>) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.</li> <li>Fixed the in-client captive-portal browser rendering a blank &quot;Success&quot; page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline&#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.</li> <li>Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> </ul> Fri, 29 May 2026 00:55:38 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Windows (version 2026.5.1155.1)https://developers.cloudflare.com/changelog/post/2026-05-29-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2026-05-29-warp-windows-beta/<p>A new Beta release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for Windows! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>The client now applies DNS search suffixes configured in your <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles">device profile</a> / <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies">network policy</a>. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes">DNS search suffixes</a> for details.</li> <li>Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#vnet-availability">VNET availability</a> for details.</li> <li>Added mandatory authentication. When enabled via MDM, the Cloudflare One Client blocks all Internet traffic from the moment the machine boots until the user authenticates, closing the visibility gap on newly deployed devices and during re-authentication. See the <a href="https://blog.cloudflare.com/mandatory-authentication-mfa/">announcement blog</a> and <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-no-auth-no-internet/">documentation</a> for details.</li> <li>Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.</li> <li>Added new warp-cli debug commands for interactive connection diagnosis. See <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging">Extra debug logging</a> for details.</li> <li>The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.</li> <li>Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs">Cloudflare One MDM documentation</a> for details.</li> <li>Client Certificate device-posture checks now support template variables (e.g. <code>${serial_number}</code>, <code>${device_uuid}</code>) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.</li> <li>The UseWebView2 registry value (HKLM\SOFTWARE\Cloudflare\CloudflareWARP\UseWebView2 = y) is once again honored by the new GUI for authentication, so administrators who prefer the embedded WebView2 browser for sign-in can opt back in. This setting was effectively ignored in the previous release; the default browser was always used. This key is now also honored for re-authentications.</li> <li>Fixed a crash in the authentication browser when navigating to a site that prompts for browser permissions (microphone, camera, notifications, etc.). The same fix had previously landed for the captive-portal browser; this extends it to the auth browser.</li> <li>Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>An error indicating that Microsoft Edge can&#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.</li> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> <li>Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.</li> <li>DNS resolution may be broken when the following conditions are all true:<ul> <li>The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while the client is connected.<br>To work around this issue, please reconnect the client by selecting &quot;disconnect&quot; and then &quot;connect&quot; in the client user interface.</li> </ul> </li> </ul> Fri, 29 May 2026 00:55:37 GMTCloudflare One ClientCloudflare One ClientAgents - Share sandbox previews through Cloudflare Tunnelhttps://developers.cloudflare.com/changelog/post/2026-05-29-sandbox-named-tunnels/https://developers.cloudflare.com/changelog/post/2026-05-29-sandbox-named-tunnels/ <p><a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> can expose a service running inside the container on a public preview URL through the <code>sandbox.tunnels</code> namespace. The SDK uses <code>cloudflared</code> inside the sandbox so you can share a running service without configuring <code>exposePort()</code> or a custom domain.</p> <p>By default, <code>sandbox.tunnels.get(port)</code> creates a <a href="https://try.cloudflare.com/" target="_blank" rel="noopener">quick tunnel<span class="external-link"> ↗</span></a> on a zero-config <code>*.trycloudflare.com</code> URL — no Cloudflare account, DNS record, or custom domain required. This is perfect for quick development and for <code>.workers.dev</code> deployments.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { getSandbox } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> sandbox</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getSandbox</span><span class="nb-shiki-140thh">(env.Sandbox, </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">startProcess</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"python -m http.server 8080"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tunnel</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.tunnels.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">8080</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(tunnel.url); </span><span class="nb-shiki-21nrsd">// → https://random-words-here.trycloudflare.com</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { getSandbox } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> sandbox</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getSandbox</span><span class="nb-shiki-140thh">(env.Sandbox, </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">startProcess</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"python -m http.server 8080"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tunnel</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.tunnels.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">8080</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(tunnel.url); </span><span class="nb-shiki-21nrsd">// → https://random-words-here.trycloudflare.com</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="named-tunnels">Named tunnels</h4><a class="anchor-link" href="#named-tunnels"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For more control you can create a named tunnel through <code>sandbox.tunnels.get(port, { name })</code>. A named tunnel binds a hostname (<code>&lt;name&gt;.&lt;your-zone&gt;</code>) backed by a <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> and a CNAME record on your zone resulting in something like <a href="https://my-app-preview.example.com" target="_blank" rel="noopener">https://my-app-preview.example.com<span class="external-link"> ↗</span></a>.</p> <p>Unlike quick tunnels, which generate a new random URL each time, a named tunnel produces a persistent URL that survives container restarts. This makes named tunnels suitable for production use cases where you want control over the tunnel and it's origin.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tunnel</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.tunnels.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">8080</span><span class="nb-shiki-140thh">, { name: </span><span class="nb-shiki-mdbnqw">"my-app-preview"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(tunnel.url); </span><span class="nb-shiki-21nrsd">// → https://my-app-preview.example.com</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tunnel</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.tunnels.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">8080</span><span class="nb-shiki-140thh">, { name: </span><span class="nb-shiki-mdbnqw">"my-app-preview"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(tunnel.url); </span><span class="nb-shiki-21nrsd">// → https://my-app-preview.example.com</span></span></code></pre></figure></div></div></div></div> <p>Calling <code>sandbox.destroy()</code> tears down the Cloudflare Tunnel and the associated DNS record alongside the container, so you do not leave dangling tunnels or records behind.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-npm" id="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-yarn" id="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-pnpm" id="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-bun" id="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-npm" aria-labelledby="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i @cloudflare/sandbox@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i @cloudflare/sandbox@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-yarn" aria-labelledby="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add @cloudflare/sandbox@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add @cloudflare/sandbox@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-pnpm" aria-labelledby="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add @cloudflare/sandbox@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add @cloudflare/sandbox@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-bun" aria-labelledby="pm-tab-pm-157c1f84-314e-4c5c-ae77-3457f0f5d9ca-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add @cloudflare/sandbox@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add @cloudflare/sandbox@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>For full API details, refer to the <a href="https://developers.cloudflare.com/sandbox/api/tunnels/">Sandbox tunnels reference</a>.</p>Fri, 29 May 2026 00:00:00 GMTAgentsAgentsD1 - D1 migrations support nested layouts via `migrations_pattern`https://developers.cloudflare.com/changelog/post/2026-06-04-migrations-pattern/https://developers.cloudflare.com/changelog/post/2026-06-04-migrations-pattern/<p>You can now point <code>wrangler d1 migrations apply</code> at a nested migrations layout — such as the one produced by <a href="https://orm.drizzle.team/" target="_blank" rel="noopener">Drizzle<span class="external-link"> ↗</span></a> (<code>migrations/0001_init/migration.sql</code>) — using the new <code>migrations_pattern</code> D1 binding config:</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "d1_databases"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"DB"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "database_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-database"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "database_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;UUID&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations_dir"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"migrations"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations_pattern"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"migrations/*/migration.sql"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p><code>migrations_pattern</code> is a glob (relative to your Wrangler config file) used to discover migration files. It defaults to <code>${migrations_dir}/*.sql</code>, so existing projects keep working unchanged. Each migration's name is recorded in the migrations table as a path relative to <code>migrations_dir</code>.</p> <p>To learn more, visit D1's <a href="https://developers.cloudflare.com/d1/reference/migrations/#nested-migration-layouts">migrations documentation</a>.</p>Fri, 29 May 2026 00:00:00 GMTD1D1Logs - Updated fields across multiple Logpush datasets in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2026-05-29-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-05-29-log-fields-updated/<p>Cloudflare has updated <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updated-fields-in-existing-datasets">Updated fields in existing datasets</h4><a class="anchor-link" href="#updated-fields-in-existing-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>DEX Device State Events</strong> (added): <code>DeviceRegistrationProfileID</code>.</li> <li><strong>Gateway HTTP</strong> (added): <code>AddedHeaders</code>, <code>DeletedHeaders</code>, and <code>SetHeaders</code>.</li> <li><strong>HTTP requests</strong> (added): <code>MatchedRules</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Fri, 29 May 2026 00:00:00 GMTLogsLogsRadar - TLS bug detection in the Cloudflare Radar post-quantum checkerhttps://developers.cloudflare.com/changelog/post/2026-05-29-radar-pq-tls-bug-detection/https://developers.cloudflare.com/changelog/post/2026-05-29-radar-pq-tls-bug-detection/<p>The <a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> <a href="https://radar.cloudflare.com/post-quantum#website-support" target="_blank" rel="noopener">post-quantum TLS support checker<span class="external-link"> ↗</span></a> now also reports TLS bugs detected during the handshake test. When a scanned host exhibits compatibility issues, the results include details on the specific bugs detected, along with guidance on how to investigate and remediate each issue. The bugs section only appears for hosts where issues are found.</p> <p>The following TLS bugs are detected:</p> <ul> <li><strong>Split ClientHello</strong> — The connection fails with a fragmented post-quantum <code>ClientHello</code> but succeeds with classical handshakes. Typically caused by middleboxes or firewalls that cannot reassemble split TLS messages.</li> <li><strong>HRR Failure</strong> — The server sends a <code>HelloRetryRequest</code> but fails to complete the handshake afterward.</li> <li><strong>Unknown Keyshare</strong> — The server cannot handle unknown key exchange algorithms and fails instead of responding with a <code>HelloRetryRequest</code> as required by the TLS 1.3 specification.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2260,height=1244,format=webp/_astro/pq-tls-bug-detection.BrmsVMno.png" alt="TLS bug detection results in the Radar post-quantum checker" loading="lazy" decoding="async" width="2260" height="1244"> <p>Bug detection data is available through the existing <a href="https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/subresources/tls/methods/support/"><code>/post_quantum/tls/support</code></a> endpoint.</p> <p>Visit the <a href="https://radar.cloudflare.com/post-quantum#website-support" target="_blank" rel="noopener">Post-Quantum Encryption<span class="external-link"> ↗</span></a> page to test a host.</p>Fri, 29 May 2026 00:00:00 GMTRadarRadarRealtime - Cloudflare's Realtime WebSocket adapter now auto-reconnects and buffers WebRTC mediahttps://developers.cloudflare.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/https://developers.cloudflare.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/<p><a href="https://developers.cloudflare.com/realtime/sfu/">Cloudflare Realtime SFU</a> is a <a href="https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/">WebRTC Selective Forwarding Unit that runs on Cloudflare's global network</a>, so you can route live audio, video, and data between WebRTC clients around the world without managing SFU infrastructure or regions.</p> <p>When you use the <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/">WebSocket adapter</a> to stream WebRTC media to a WebSocket endpoint, the adapter now auto-reconnects and buffers audio and video after brief endpoint disconnects or restarts.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="streaming-webrtc-media-to-websocket-endpoints">Streaming WebRTC media to WebSocket endpoints</h4><a class="anchor-link" href="#streaming-webrtc-media-to-websocket-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Many teams also use Realtime SFU as the media layer for backend applications, such as transcription, recording, note-taking, and agentic media-processing services. These systems often need to consume live WebRTC audio or video from the SFU in backend infrastructure, including <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>, <a href="https://developers.cloudflare.com/workers/">Workers</a>, <a href="https://developers.cloudflare.com/containers/">Containers</a>, or external services, without running a WebRTC client themselves.</p> <p>The <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/">WebSocket adapter</a> bridges that gap by streaming WebRTC media from the SFU to a standard WebSocket endpoint as application-consumable payloads: <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-formats">PCM audio frames and JPEG video frames</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you use the WebSocket adapter in <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#stream-mode-egress">Stream mode (egress)</a> to send live audio or video from the SFU to your own WebSocket endpoint, the SFU now <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming">automatically reconnects</a> after brief endpoint disconnects or restarts. This is especially helpful for long-running media pipelines where the WebSocket endpoint may briefly restart while a recording, transcription, or live analysis job is still in progress.</p> <p>Previously, a brief disconnect from your WebSocket endpoint could close the adapter and require your application to recreate it before media could resume. Now, the SFU retries the same endpoint for up to 5 seconds with no API change required. If the endpoint comes back within that window, audio and video delivery resumes automatically.</p> <p>The reconnect behavior also includes <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-buffering-during-reconnect">live-first media buffering</a>, so brief interruptions reduce media loss without replaying stale video.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="reconnect-behavior">Reconnect behavior</h4><a class="anchor-link" href="#reconnect-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>During reconnect:</p> <ul> <li>Audio uses a short bounded backlog to reduce audible loss. If the interruption lasts longer than the backlog can cover, older audio may be dropped.</li> <li>Video resumes from the <a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#video-jpeg">latest available JPEG frame</a> instead of replaying stale frames.</li> <li>Recovery is best effort and does not guarantee gapless or exactly-once delivery.</li> </ul> <p>If the endpoint remains unavailable after the 5-second reconnect window, the adapter closes and must be recreated.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/">WebSocket adapter</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming">Automatic reconnection for streaming</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/get-started/">Get started with Realtime SFU</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/example-architecture/">Realtime SFU example architecture</a></li> <li><a href="https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/">Realtime vs Regular SFUs</a></li> <li><a href="https://realtime-sfu.dev-demos.workers.dev/" target="_blank" rel="noopener">Global SFU Network Visualization<span class="external-link"> ↗</span></a></li> </ul>Fri, 29 May 2026 00:00:00 GMTRealtimeRealtimeSecurity Center - Security scans more frequenthttps://developers.cloudflare.com/changelog/post/2026-05-29-security-insights-default-scans/https://developers.cloudflare.com/changelog/post/2026-05-29-security-insights-default-scans/<p>Security Insights scans now run more often. Cloudflare scans Free accounts <strong>every 7 days</strong>, Pro and Business accounts <strong>every 3 days</strong>, and Enterprise accounts <strong>daily</strong>.</p> <p>In addition, all accounts and zones now receive scans by default. You no longer need to enable scans before Cloudflare checks your account for misconfigurations, vulnerabilities, and other security risks.</p> <p>Granular on-demand scans are now available on any plan. You can trigger an on-demand scan for any zone, insight, insight type from the Cloudflare dashboard in order to quickly re-check your security posture after remediating an issue.</p> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/security/security-insights/">Security Insights documentation</a>.</p>Fri, 29 May 2026 00:00:00 GMTSecurity CenterSecurity CenterAccess - Tool and prompt aliases for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-05-28-mcp-portal-tool-prompt-aliases/https://developers.cloudflare.com/changelog/post/2026-05-28-mcp-portal-tool-prompt-aliases/<p>When you connect third-party MCP servers through <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a>, you have no control over how the server author named tools or wrote descriptions. Unclear names make it harder for AI agents to select the right tool and harder for users to understand what is available.</p> <p>You can now <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#rename-tools-and-prompts-with-aliases">rename tools and prompts</a> and rewrite their descriptions directly on the portal, without modifying the upstream server. For example, a tool named <code>super_cool_tool</code> can become <code>search_customer_records</code> with a description tailored to your organization.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1640,height=1144,format=webp/_astro/portal-edit-tool-modal.DrxORhBl.png" alt="Edit tool modal showing name and description fields for an MCP server tool" loading="lazy" decoding="async" width="1640" height="1144"> <p>Modified tools display a <strong>Modified</strong> label in the tools list so administrators can see which tools have been customized at a glance.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1862,height=700,format=webp/_astro/portal-tools-authorized-modified.B674Xvip.png" alt="Tools authorized list showing a modified label on a renamed tool" loading="lazy" decoding="async" width="1862" height="700"> <p>Aliases override the metadata that MCP clients receive. You can set them at two levels:</p> <ul> <li><strong>Per portal</strong>: Applies only within a specific portal. Takes precedence over server-level aliases.</li> <li><strong>Per server</strong>: Applies across all portals that use the server.</li> </ul> <p>You can reset an alias at any time to restore the original upstream name.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#rename-tools-and-prompts-with-aliases">Tool and prompt aliases</a>.</p>Thu, 28 May 2026 00:00:00 GMTAccessAccessBrowser Run - Use Browser Run Quick Actions directly from Workershttps://developers.cloudflare.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/https://developers.cloudflare.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/ <p>You can now call <a href="https://developers.cloudflare.com/browser-run/quick-actions/">Browser Run Quick Actions</a> directly from a <a href="https://developers.cloudflare.com/workers/">Cloudflare Worker</a> using the <code>quickAction()</code> method on the browser binding. This simplifies how Workers interact with Browser Run by removing the need for API tokens or external HTTP requests. Your Worker communicates with Browser Run directly over Cloudflare's network, resulting in simpler code and lower latency.</p> <p>With the <code>quickAction()</code> method you can:</p> <ul> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/">Capture screenshots</a> from URLs or HTML</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/">Generate PDFs</a> with custom styling, headers, and footers</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/">Extract HTML content</a> from fully rendered pages</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/">Convert pages to Markdown</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/">Extract structured JSON</a> using AI</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/">Scrape elements</a> with CSS selectors</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/">Get all links</a> from a page</li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/">Capture snapshots</a> (HTML + screenshot in one request)</li> </ul> <p>To get started, add a browser binding to your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-03-24"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "browser"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"BROWSER"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-03-24"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">browser</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"BROWSER"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Then call any Quick Action directly from your Worker. For example, to capture a screenshot:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> screenshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">quickAction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"screenshot"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://www.cloudflare.com/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> screenshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">quickAction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"screenshot"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://www.cloudflare.com/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>The <code>quickAction()</code> method requires a compatibility date of <code>2026-03-24</code> or later.</p> <p>For setup instructions and the full list of available actions, refer to <a href="https://developers.cloudflare.com/browser-run/quick-actions/">Browser Run Quick Actions</a>.</p>Thu, 28 May 2026 00:00:00 GMTBrowser RunBrowser RunCloudflare Mesh, Cloudflare One - High availability replica management for Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-05-28-mesh-ha-replica-ui/https://developers.cloudflare.com/changelog/post/2026-05-28-mesh-ha-replica-ui/<p>The <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> dashboard now shows per-replica details for <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/">high availability</a> nodes. You can see which replica is active, view each replica's Mesh IP and connection details, and manually trigger failover — all from the node detail page.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1155,format=webp/_astro/mesh-ha-replicas.Dvf1GMmQ.gif" alt="Mesh HA replica tabs showing active and passive replicas with per-replica Mesh IPs and a manual failover option" loading="lazy" decoding="async" width="1800" height="1155"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Replica tabs</strong> on the node detail page — switch between replicas to see each one's Mesh IP, edge data center, origin IP, platform, version, and uptime.</li> <li><strong>Active/passive badges</strong> identify which replica is currently routing traffic.</li> <li><strong>Manual failover</strong> — promote a passive replica to active with a single click. The previous active replica switches to standby.</li> <li><strong>HA badge</strong> in the overview table identifies nodes running multiple replicas.</li> <li><strong>Active replica IP</strong> shown in the overview table — the dashboard now resolves which replica is active and displays the correct Mesh IP.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="manual-failover">Manual failover</h4><a class="anchor-link" href="#manual-failover"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To manually promote a passive replica:</p> <ol> <li>In the <a href="https://dash.cloudflare.com/?to=/:account/mesh" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Networking</strong> &gt; <strong>Mesh</strong>.</li> <li>Select an HA-enabled node.</li> <li>Select the passive replica tab.</li> <li>Select <strong>Promote to active</strong> and confirm.</li> </ol> <p>Traffic reroutes to the promoted replica immediately. Refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/">High availability</a> for details on failover behavior.</p>Thu, 28 May 2026 00:00:00 GMTCloudflare MeshCloudflare MeshCloudflare OneContainers - Wrangler supports SSH ProxyCommand for Containershttps://developers.cloudflare.com/changelog/post/2026-05-28-ssh-proxy-command/https://developers.cloudflare.com/changelog/post/2026-05-28-ssh-proxy-command/<p><a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> supports using <code>wrangler containers ssh</code> as an OpenSSH <code>ProxyCommand</code> for <a href="https://developers.cloudflare.com/containers/">Containers</a>. This lets your local SSH client connect to a running Container through Wrangler.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">ssh</span><span class="nb-shiki-dzsirb"> -o</span><span class="nb-shiki-mdbnqw"> ProxyCommand="wrangler containers ssh %h"</span><span class="nb-shiki-mdbnqw"> cloudchamber@</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">INSTANCE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>When standard input and output are piped, Wrangler forwards data to the SSH server in the Container. You can also pass <code>--stdio</code> to force this mode.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/containers/ssh/">SSH documentation</a>.</p>Thu, 28 May 2026 00:00:00 GMTContainersContainersEmail Service - Send emails with named recipient addresseshttps://developers.cloudflare.com/changelog/post/2026-05-28-named-email-recipients/https://developers.cloudflare.com/changelog/post/2026-05-28-named-email-recipients/ <p>You can now send emails with display names on recipient addresses in addition to the existing <code>from</code> support. Pass an object with <code>email</code> and an optional <code>name</code> field for <code>to</code>, <code>cc</code>, <code>bcc</code>, <code>replyTo</code>, or <code>from</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EMAIL</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> from: { email: </span><span class="nb-shiki-mdbnqw">"support@example.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Support Team"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> to: { email: </span><span class="nb-shiki-mdbnqw">"jane@example.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Jane Doe"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> cc: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "manager@company.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { email: </span><span class="nb-shiki-mdbnqw">"team@company.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Engineering Team"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> subject: </span><span class="nb-shiki-mdbnqw">"Welcome!"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> html: </span><span class="nb-shiki-mdbnqw">"&#x3C;h1>Thanks for joining!&#x3C;/h1>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> text: </span><span class="nb-shiki-mdbnqw">"Thanks for joining!"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ messageId: response.messageId });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EMAIL</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> from: { email: </span><span class="nb-shiki-mdbnqw">"support@example.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Support Team"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> to: { email: </span><span class="nb-shiki-mdbnqw">"jane@example.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Jane Doe"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> cc: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "manager@company.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { email: </span><span class="nb-shiki-mdbnqw">"team@company.com"</span><span class="nb-shiki-140thh">, name: </span><span class="nb-shiki-mdbnqw">"Engineering Team"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> subject: </span><span class="nb-shiki-mdbnqw">"Welcome!"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> html: </span><span class="nb-shiki-mdbnqw">"&#x3C;h1>Thanks for joining!&#x3C;/h1>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> text: </span><span class="nb-shiki-mdbnqw">"Thanks for joining!"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ messageId: response.messageId });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">>;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Plain strings remain fully supported for backward compatibility, and you can mix strings and named objects in the same array.</p> <p>Refer to the <a href="https://developers.cloudflare.com/email-service/api/send-emails/workers-api/">Workers API</a> and <a href="https://developers.cloudflare.com/email-service/api/send-emails/rest-api/">REST API</a> documentation for full request examples.</p>Thu, 28 May 2026 00:00:00 GMTEmail ServiceEmail ServicePipelines - Pipelines pricing announcedhttps://developers.cloudflare.com/changelog/post/2026-05-11-pipelines-pricing-announced/https://developers.cloudflare.com/changelog/post/2026-05-11-pipelines-pricing-announced/<p><a href="https://developers.cloudflare.com/pipelines/">Cloudflare Pipelines</a> is a streaming data platform that ingests events, transforms them with SQL, and writes to <a href="https://developers.cloudflare.com/r2/">R2</a> as JSON, Parquet, or <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables. Pipelines now has published pricing based on two usage dimensions: the volume of data processed by SQL transforms and the volume of data delivered to sinks. Ingress into a Pipeline stream is free.</p> <p><strong>Billing is not yet enabled. We will provide at least 30 days notice before we start charging for Pipelines usage.</strong></p> <p>Pipelines pricing model is designed to charge per GB based on what you use:</p> <ul> <li><strong>Streams (ingress)</strong>: Free, regardless of volume.</li> <li><strong>SQL transforms</strong>: $0.04 / GB for stateless transforms (filter, reshape, unnest, cast, compute).</li> <li><strong>Sinks</strong>: $0.03 / GB for JSON, $0.06 / GB for Parquet or Iceberg output.</li> </ul> <p>Workers Free plans include 1 GB / month for each dimension. Workers Paid plans include 50 GB / month.</p> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/pipelines/platform/pricing/">Pipelines pricing</a>.</p>Thu, 28 May 2026 00:00:00 GMTPipelinesPipelinesR2, R2 Data Catalog - R2 Data Catalog pricing announcedhttps://developers.cloudflare.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/https://developers.cloudflare.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> is a managed <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> data catalog built directly into R2 buckets, queryable by any Iceberg-compatible engine such as Spark, Snowflake, and DuckDB. R2 Data Catalog now has published pricing for catalog operations and table compaction, in addition to standard <a href="https://developers.cloudflare.com/r2/pricing/">R2 storage and operations</a>.</p> <p>Billing is not yet enabled. We will provide at least 30 days notice before we start charging for R2 Data Catalog usage.</p> <p>Pricing is based on two dimensions:</p> <ul> <li><strong>Catalog operations</strong>: $9.00 / million operations for metadata requests such as creating tables, reading table metadata, and updating table properties.</li> <li><strong>Compaction</strong>: $0.005 / GB processed and $2.00 / million objects processed. These charges only apply when automatic compaction is turned on for a table.</li> </ul> <p>Both dimensions include a monthly free tier: 1 million catalog operations, 10 GB of compaction data processed, and 1 million compaction objects processed.</p> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/platform/pricing/">R2 Data Catalog pricing</a>.</p>Thu, 28 May 2026 00:00:00 GMTR2R2R2 Data CatalogR2, R2 Data Catalog - R2 Data Catalog gets a dedicated dashboard experiencehttps://developers.cloudflare.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/https://developers.cloudflare.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> is a managed <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> data catalog built directly into your R2 bucket. It exposes a standard Iceberg REST catalog interface so you can connect query engines like <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/spark-scala/">Spark</a>, <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/snowflake/">Snowflake</a>, <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/">DuckDB</a>, and <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> to your data in R2.</p> <p>R2 Data Catalog now has a dedicated section in the Cloudflare dashboard, replacing the previous settings panel embedded in R2 bucket configuration. The new experience includes:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3070,height=1486,format=webp/_astro/data-catalog-dashboard.BsKDvUQn.png" alt="R2 Data Catalog dashboard overview" loading="lazy" decoding="async" width="3070" height="1486"> <ul> <li><strong>Catalog overview</strong> — View all your catalogs in one place with catalog request counts, bucket sizes, and table maintenance status at a glance.</li> <li><strong>Guided setup wizard</strong> — Create a catalog in three steps: choose or create an R2 bucket, configure table maintenance (compaction and snapshot expiration), and review. The wizard creates the bucket and generates a service credential automatically.</li> <li><strong>Settings management</strong> — A dedicated settings page for each catalog with sections for general configuration, table maintenance, service credentials, and disabling the catalog. You can now enable and configure <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">snapshot expiration</a> directly from the dashboard.</li> <li><strong>Built-in metrics</strong> — Five charts on each catalog's metrics tab: bytes compacted, files compacted, catalog requests, storage size, and snapshots expired.</li> </ul> <p>To get started, go to <strong>R2 Data Catalog</strong> in the Cloudflare dashboard or refer to the <a href="https://developers.cloudflare.com/r2-data-catalog/get-started/">getting started guide</a> and <a href="https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/">manage catalogs documentation</a>.</p>Thu, 28 May 2026 00:00:00 GMTR2R2R2 Data CatalogR2 SQL - R2 SQL pricing announcedhttps://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/https://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/<p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> is a serverless, distributed query engine that runs SQL against <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>. R2 SQL now has published pricing based on a single dimension: the volume of compressed data scanned to execute your queries. At $2.50 / TB ($0.0025 / GB), R2 SQL is priced at half the cost of AWS Athena and less than half of Google BigQuery on-demand.</p> <p>Billing is not yet enabled. We will provide at least 30 days notice before we start charging for R2 SQL usage.</p> <p>Data scanned is measured on compressed bytes read from R2 object storage. This matches what you see in your R2 bucket — if a Parquet file is 100 MB on disk, scanning that file bills for 100 MB. Each query has a minimum billing increment of 10 MB.</p> <p>All plans include 10 GB of data scanned per month. Standard <a href="https://developers.cloudflare.com/r2/pricing/">R2 storage and operations</a> and <a href="https://developers.cloudflare.com/r2-data-catalog/platform/pricing/">R2 Data Catalog</a> charges apply separately.</p> <p>For full pricing details and billing examples, refer to <a href="https://developers.cloudflare.com/r2-sql/platform/pricing/">R2 SQL pricing</a>.</p>Thu, 28 May 2026 00:00:00 GMTR2 SQLR2 SQLRealtime - Record specific participant audio tracks in RealtimeKithttps://developers.cloudflare.com/changelog/post/2026-05-28-realtimekit-track-recording/https://developers.cloudflare.com/changelog/post/2026-05-28-realtimekit-track-recording/<p>You can now record specific participant audio tracks in RealtimeKit with <a href="https://developers.cloudflare.com/realtime/realtimekit/recording-guide/track-recording/">track recording</a>. Track recording creates separate WebM files for each participant instead of a single composite recording, which is useful for post-processing, transcription, and regulated or content-sensitive workflows.</p> <p>To record specific participants, pass <code>user_ids</code> when starting a track recording:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">account_i</span><span class="nb-shiki-140thh">d</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">/realtime/kit/</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">app_i</span><span class="nb-shiki-140thh">d</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">/recordings/track</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;api_token&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "user_ids": ["user-123", "user-456"]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure> <p>To pass <code>user_ids</code> for selective track recording, use the following minimum SDK versions:</p> <ul> <li>Web Core: <code>@cloudflare/realtimekit</code> version <code>1.4.0</code> or later</li> <li>Web UI Kit: <code>@cloudflare/realtimekit-ui</code>, <code>@cloudflare/realtimekit-react-ui</code>, or <code>@cloudflare/realtimekit-angular-ui</code> version <code>1.1.2</code> or later</li> <li>Android Core or iOS Core: version <code>2.0.0</code> or later</li> <li>Android UI Kit or iOS UI Kit: version <code>1.1.0</code> or later</li> </ul> <p><a href="https://developers.cloudflare.com/realtime/realtimekit/">RealtimeKit</a> provides SDKs and UI components so that you can build your own meeting experience on Cloudflare's <a href="https://developers.cloudflare.com/realtime/#realtime-sfu">global WebRTC infrastructure</a>. Teams today build products ranging from telehealth to education on RealtimeKit for global audiences. You can get started today with our <a href="https://developers.cloudflare.com/realtime/realtimekit/quickstart/">Quickstart</a> or take a look at our <a href="https://github.com/cloudflare/meet" target="_blank" rel="noopener">Cloudflare Meet repo<span class="external-link"> ↗</span></a> as a reference.</p>Thu, 28 May 2026 00:00:00 GMTRealtimeRealtimeCloudflare One, Gateway - Write regex using natural language in Cloudflare Onehttps://developers.cloudflare.com/changelog/post/2026-05-27-cloudy-regex-assistance/https://developers.cloudflare.com/changelog/post/2026-05-27-cloudy-regex-assistance/<p><a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a> policy selectors which support regular expressions can now be authored in the dashboard using natural language. When building a <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/expression-syntax/">policy</a> with a regex-based selector (like <code>matches regex</code>), you can describe what you want to match in plain English and the Cloudflare Agent will generate and validate a corresponding regular expression.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1000,height=638,format=webp/_astro/gateway-regex-ai-generation.CtJ0S6FS.png" alt="Write policy regex using natural language" loading="lazy" decoding="async" width="1000" height="638"> <p>To get started, select a regex-compatible selector in the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway policy builder</a> and select the icon. You'll see an input field for natural language, such as "any URL starting with /api/v1" or ".com, .net, and .app hosts which contain <code>gooogle</code> in the host."</p> <p>You can also use the tool to explain existing regular expressions. If a policy already contains a regex pattern, you can instantly generate a plain-language description.</p> <p>A built-in feedback mechanism allows you to rate each interaction to help improve output quality over time.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare One firewall policies</a> and expect to see the same functionality supported soon in <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/">Data loss prevention profiles</a>.</p>Wed, 27 May 2026 00:00:00 GMTCloudflare OneCloudflare OneGatewayCloudflare Images - Transformation flows in Imageshttps://developers.cloudflare.com/changelog/post/2026-05-27-transformation-flows/https://developers.cloudflare.com/changelog/post/2026-05-27-transformation-flows/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1654,height=1398,format=webp/_astro/custom-flow.DeAGR8BY.png" alt="Custom flow configuration panel" loading="lazy" decoding="async" width="1654" height="1398"> <p>Flows are automated rules that pair conditions (such as file extension, URL path, or query parameter) with parameters. Set up a flow to automatically apply image optimization to matching requests on your zone without writing code or changing URLs.</p> <p>There are two modes for transformation flows:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/images/optimization/transformations/flows/#set-up-a-provider-flow">Provider flows</a></strong> — Migrate from another image optimization service. Your existing URLs continue to work while Cloudflare rewrites provider-specific parameters to their Cloudflare equivalents. Currently, Cloudflare supports provider flows for Fastly Image Optimizer.</li> <li><strong><a href="https://developers.cloudflare.com/images/optimization/transformations/flows/#set-up-a-custom-flow">Custom flows</a></strong> — Define your own conditions and actions for use cases like automatic format conversion, <a href="https://developers.cloudflare.com/images/optimization/make-responsive-images/#using-widthauto">responsive sizing</a> with <code>width=auto</code>, or directory-based optimization.</li> </ul> <p>To get started, go to <strong>Images</strong> &gt; <strong>Transformations</strong> &gt; <strong>Automation</strong> in the <a href="https://dash.cloudflare.com/?to=/:account/images/transformations" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>.</p> <p>Learn more about <a href="https://developers.cloudflare.com/images/optimization/transformations/flows/">transformation flows</a>.</p>Wed, 27 May 2026 00:00:00 GMTCloudflare ImagesCloudflare ImagesCloudflare Tunnel, Cloudflare Tunnel for SASE - Cloudflare Tunnel now runs connectivity pre-checks at startuphttps://developers.cloudflare.com/changelog/post/2026-05-27-cloudflared-connectivity-prechecks/https://developers.cloudflare.com/changelog/post/2026-05-27-cloudflared-connectivity-prechecks/<p>Starting with <a href="https://github.com/cloudflare/cloudflared/releases" target="_blank" rel="noopener"><code>cloudflared</code> version 2026.5.2<span class="external-link"> ↗</span></a>, <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a> automates the entire <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/connectivity-prechecks/">connectivity pre-checks workflow</a> directly inside the binary. Previously, customers had to install <code>dig</code> and <code>netcat</code> and run those commands by hand to verify their environment. Now <code>cloudflared</code> does it natively at startup — and surfaces actionable remediation when something is blocked.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1012,format=webp/_astro/cloudflared-connectivity-prechecks.DRwN6tGe.gif" alt="cloudflared connectivity pre-checks output" loading="lazy" decoding="async" width="1800" height="1012"> <p>On every <code>cloudflared tunnel run</code> (and <code>cloudflared tunnel diag</code>), the binary now natively checks:</p> <ul> <li><strong>DNS resolution</strong> — <code>region1.v2.argotunnel.com</code> and <code>region2.v2.argotunnel.com</code> resolve to valid Cloudflare IPs.</li> <li><strong>Transport connectivity</strong> — outbound <code>UDP (QUIC)</code> and <code>TCP (HTTP/2)</code> on port <code>7844</code>.</li> <li><strong>Management API</strong> — outbound <code>TCP/443</code> to <code>api.cloudflare.com</code> for software updates.</li> </ul> <p>Results are printed in a scannable CLI table with three states:</p> <ul> <li>✅ <strong>Pass</strong> — the check succeeded.</li> <li>⚠️ <strong>Warn</strong> — a non-blocking issue, for example the Management API is unreachable so automatic updates will not work, but the tunnel will still come up.</li> <li>❌ <strong>Fail</strong> — a blocking issue, with a specific remediation hint (for example, <code>Allow outbound UDP on port 7844</code>).</li> </ul> <p>If DNS is unresolvable, or <strong>both</strong> UDP and TCP fail on port 7844, <code>cloudflared</code> exits early with the failure rather than looping on opaque <code>failed to dial</code> errors.</p> <p>Pre-checks now run automatically on every start, which also catches regressions like overnight firewall policy changes — no need to remember to rerun the troubleshooting guide.</p> <p>To get the new behavior, upgrade <code>cloudflared</code> to version <code>2026.5.2</code> or later. For more details, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/connectivity-prechecks/">Connectivity pre-checks documentation</a>.</p>Wed, 27 May 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASECloudflare One Client - Cloudflare One Client for macOS (version 2026.4.1390.0)https://developers.cloudflare.com/changelog/post/2026-05-26-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-05-26-warp-macos-ga/<p>A new GA release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> <li>Fixed a proxy mode connection stall issue.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> </ul> Tue, 26 May 2026 22:26:01 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Windows (version 2026.4.1390.0)https://developers.cloudflare.com/changelog/post/2026-05-26-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-05-26-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for Windows! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> <li>Fixed a proxy mode connection stall issue.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration authentication for devices via the integrated WebView2 browser is unavailable in this version as a temporary measure. As a result, the client will utilize the default browser on the device to complete the authentication process.</li> <li>An error indicating that Microsoft Edge can&#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.</li> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> <li>Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.</li> <li>DNS resolution may be broken when the following conditions are all true:<ul> <li>The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while the client is connected.<br>To work around this issue, please reconnect the client by selecting &quot;disconnect&quot; and then &quot;connect&quot; in the client user interface.</li> </ul> </li> </ul> Tue, 26 May 2026 22:26:00 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Linux (version 2026.4.1390.0)https://developers.cloudflare.com/changelog/post/2026-05-26-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-05-26-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for Linux! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> <li>Official support for RHEL 9 has been added for Cloudflare Mesh nodes. To install the RHEL 9 package, the Extra Packages for Enterprise Linux (EPEL) repository must be active, as it contains dependencies required for the tray icon and captive portal webview.</li> <li>Fixed a proxy mode connection stall issue.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> </ul> Tue, 26 May 2026 20:32:41 GMTCloudflare One ClientCloudflare One ClientCache - BYPASS status now returned for uncacheable responseshttps://developers.cloudflare.com/changelog/post/2026-05-26-bypass-status-for-uncacheable-responses/https://developers.cloudflare.com/changelog/post/2026-05-26-bypass-status-for-uncacheable-responses/<p>Cloudflare now returns a <code>BYPASS</code> <a href="https://developers.cloudflare.com/cache/concepts/cache-responses/">cache status</a> whenever a response is not cacheable, instead of the previous mix of <code>BYPASS</code> and <code>MISS</code> that depended on why Cloudflare chose not to cache the response.</p> <p>There are multiple reasons Cloudflare may refuse to cache a response — for example, the response exceeds the <a href="https://developers.cloudflare.com/cache/concepts/default-cache-behavior/#cacheable-size-limits">maximum cacheable file size</a> for your plan, the origin sends <code>Cache-Control: no-cache</code>, <code>private</code>, or <code>max-age=0</code>, the response includes a <code>Set-Cookie</code> header, or the request includes an <code>Authorization</code> header.</p> <p>Previously, only some of these conditions returned <code>BYPASS</code>. Others — such as responses exceeding the maximum cacheable file size — returned <code>MISS</code> on every request, regardless of whether <a href="https://developers.cloudflare.com/cache/concepts/cache-control/#origin-cache-control-behavior">Origin Cache Control</a> was on or off. Because the response could never be cached, every subsequent request also returned <code>MISS</code>, which looked indistinguishable from a broken cache and made it hard to tell whether Cloudflare was trying and failing to cache the asset or had deliberately chosen not to cache it.</p> <p><code>BYPASS</code> now consistently signals that Cloudflare refused to cache the response, regardless of the reason. <code>MISS</code> is reserved for cacheable responses that simply were not in the local cache at request time.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-to-expect-in-your-analytics">What to expect in your analytics</h4><a class="anchor-link" href="#what-to-expect-in-your-analytics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>After this change rolls out, you should see:</p> <ul> <li><strong>MISS rate decreases</strong>: Uncacheable responses no longer count as cache misses.</li> <li><strong>BYPASS rate increases</strong>: These same responses are now reported as bypasses.</li> <li><strong>Cache hit ratio increases</strong>: Hit ratio calculations no longer include uncacheable traffic that could never have been cached, giving you a more accurate view of cache effectiveness.</li> </ul> <p>Your total request volume and origin traffic are unchanged — only the cache status label is different.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="browser-cache-ttl-behavior-is-preserved">Browser cache TTL behavior is preserved</h4><a class="anchor-link" href="#browser-cache-ttl-behavior-is-preserved"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The cache status label is the only thing changing — browser cache TTL handling for any given response is identical to what it was before:</p> <ul> <li>Responses that historically returned <code>MISS</code> because Cloudflare refused to cache them (for example, responses over the maximum cacheable file size) now return <code>BYPASS</code>, but continue to have browser cache TTL applied — exactly as they did when they were labeled <code>MISS</code>.</li> <li>Responses that historically returned <code>BYPASS</code> and skipped browser cache TTL continue to skip browser cache TTL.</li> </ul> <p>In both cases, the decision to apply browser cache TTL depends on the underlying reason Cloudflare did not cache the response, not on the new <code>BYPASS</code> label.</p>Tue, 26 May 2026 00:00:00 GMTCacheCacheFlagship - Flagship now in public betahttps://developers.cloudflare.com/changelog/post/2026-05-26-public-beta/https://developers.cloudflare.com/changelog/post/2026-05-26-public-beta/ <p><strong><a href="https://developers.cloudflare.com/flagship/">Flagship</a></strong> is now in public beta. Evaluate feature flags directly from Cloudflare Workers with no outbound HTTP calls, using globally distributed flag configuration backed by Workers KV and Durable Objects. Flagship supports typed flag values, targeting rules, percentage rollouts, audit history, and OpenFeature-compatible SDKs.</p> <p>Evaluate a flag from a Worker in a few lines of code:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> showNewCheckout</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">FLAGS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getBooleanValue</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "new-checkout"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(showNewCheckout </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-mdbnqw"> "New checkout"</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-mdbnqw"> "Standard checkout"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> showNewCheckout</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">FLAGS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getBooleanValue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"new-checkout"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> showNewCheckout </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-mdbnqw"> "New checkout"</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-mdbnqw"> "Standard checkout"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">>;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Start creating flags from the Cloudflare dashboard today. Refer to the <a href="https://developers.cloudflare.com/flagship/get-started/">Flagship documentation</a> to get started.</p>Tue, 26 May 2026 00:00:00 GMTFlagshipFlagshipAI Gateway - Call any AI model through AI Gateway's new REST APIhttps://developers.cloudflare.com/changelog/post/2026-05-21-rest-api/https://developers.cloudflare.com/changelog/post/2026-05-21-rest-api/<p>AI Gateway now uses the AI REST API on <code>api.cloudflare.com</code>. You can call any model — whether from OpenAI, Anthropic, Google, or hosted on Workers AI — through one unified API, using the same endpoints and authentication regardless of provider. Four endpoints are available:</p> <ul> <li><code>POST /ai/run</code> — universal endpoint for all models and modalities</li> <li><code>POST /ai/v1/chat/completions</code> — OpenAI SDK compatible</li> <li><code>POST /ai/v1/responses</code> — OpenAI Responses API compatible</li> <li><code>POST /ai/v1/messages</code> — Anthropic SDK compatible</li> </ul> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$CLOUDFLARE_ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/ai/v1/chat/completions"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "model": "openai/gpt-5.5",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [{"role": "user", "content": "What is Cloudflare?"}]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>All AI Gateway features — logging, caching, rate limiting, and guardrails — are applied automatically. Third-party models are billed through <a href="https://developers.cloudflare.com/ai-gateway/features/unified-billing/">Unified Billing</a>, so you do not need to manage separate provider API keys.</p> <p>Third-party model requests are routed through your account's default gateway, which is created automatically on first use. To route requests through a specific gateway, add the <code>cf-aig-gateway-id</code> header.</p> <p>If you are already calling Workers AI models through the existing REST API, that path (<code>/ai/run/@cf/{model}</code>) continues to work. To call Workers AI models through AI Gateway, use the <code>@cf/</code> model prefix (for example, <code>@cf/moonshotai/kimi-k2.6</code>) and include the <code>cf-aig-gateway-id</code> header to specify which gateway to route through.</p> <p>For more details and examples, refer to the <a href="https://developers.cloudflare.com/ai-gateway/usage/rest-api/">REST API documentation</a>.</p>Thu, 21 May 2026 00:00:00 GMTAI GatewayAI GatewayBilling - Modernized Billing Profile with new payment optionshttps://developers.cloudflare.com/changelog/post/2026-05-21-modernised-billing-profile/https://developers.cloudflare.com/changelog/post/2026-05-21-modernised-billing-profile/<p>The <a href="https://developers.cloudflare.com/billing/get-started/update-billing-info/">Billing Profile</a> now has a modern UI and a single space that unifies billing information, payment method management and an enhanced subscriptions view under a single <strong>Subscriptions</strong> tab.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Subscriptions</strong> tab brings billing information, payment method management, and your subscriptions together in one place. The payment management and <strong>Pay overdue balances</strong> flows now use the latest checkout as product purchase flows, so you can pay with Apple Pay, Google Pay, Link, and <a href="https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/">Instant Bank Payments via Link</a> alongside cards and PayPal.</p> <p>New cards complete 3D Secure authentication when the issuer requires it — for example, the EU under PSD2 and India under RBI.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=909,height=676,format=webp/_astro/2026-05-21-modernised-billing-profile.D6PysUnl.png" alt="Modernized Billing Profile with the Subscriptions tab" loading="lazy" decoding="async" width="909" height="676"> <p>For details, refer to the <a href="https://developers.cloudflare.com/billing/">Billing Home</a> documentation.</p>Thu, 21 May 2026 00:00:00 GMTBillingBillingCloudflare Fundamentals, Cloudflare One, Cloudflare Tunnel for SASE, Cloudflare Tunnel, Cloudflare Mesh - Granular permissions for Cloudflare Tunnel and Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-05-21-tunnel-mesh-granular-permissions/https://developers.cloudflare.com/changelog/post/2026-05-21-tunnel-mesh-granular-permissions/<p>You can now scope Cloudflare permissions to individual <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a> instances and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes. Administrators can delegate access to specific Tunnels or Mesh nodes without granting account-wide control over private networking.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-new">What is new</h4><a class="anchor-link" href="#what-is-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you <a href="https://developers.cloudflare.com/fundamentals/manage-members/manage/">add a member</a> or create a <a href="https://developers.cloudflare.com/fundamentals/manage-members/policies/">permission policy</a>, the resource picker now lists <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a> instances and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes as scopable resource types. You can:</p> <ul> <li>Grant a read-only role on a single Cloudflare Tunnel instance to a support operator for log streaming and diagnostics — without exposing other Tunnels or destructive actions.</li> <li>Grant a write role on a specific Cloudflare Mesh node to an application team — without giving them access to the rest of your private network.</li> <li>Scope a single policy to one or many Tunnels and Mesh nodes at once.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Granular permissions are a parallel layer to existing account-level roles — they do not replace them.</p> <ul> <li><strong>Existing account-level roles continue to work.</strong> A member with <code>Cloudflare Access</code> or <code>Cloudflare Zero Trust</code> retains write access to every Tunnel and Mesh node in the account. This ensures backward compatibility for existing automation and tokens.</li> <li><strong>Granular permissions are additive.</strong> For any API request on a specific Tunnel or Mesh node, access is granted if the principal has <strong>either</strong> the account-level role <strong>or</strong> a granular permission for that resource.</li> <li><strong>Resource enumeration is authorization-aware.</strong> Listing endpoints (<code>GET /accounts/{id}/cfd_tunnel</code>, <code>GET /accounts/{id}/warp_connector</code>) return only the resources the principal has at least read access to.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Configure <a href="https://developers.cloudflare.com/tunnel/advanced/granular-permissions/">granular permissions for Cloudflare Tunnel</a>.</li> <li>Configure <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/granular-permissions/">granular permissions for Cloudflare Tunnel and Cloudflare Mesh in Cloudflare One</a>.</li> <li>Review the <a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles">resource-scoped roles</a> on the Cloudflare role reference.</li> </ul>Thu, 21 May 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare OneCloudflare Tunnel for SASECloudflare TunnelCloudflare MeshWorkers VPC - Reach Cloudflare WAN destinations from Workers VPChttps://developers.cloudflare.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/https://developers.cloudflare.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/ <p>You can now use <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Network</a> bindings with <code>network_id: "cf1:network"</code> to reach your full private network from Workers, including:</p> <ul> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes and client devices</li> <li>Subnet routes and hostname routes announced through <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> or Cloudflare Mesh</li> <li>Destinations connected through <a href="https://developers.cloudflare.com/cloudflare-wan/">Cloudflare WAN</a> on-ramps — GRE, IPsec, and CNI</li> </ul> <p>This means a single VPC Network binding can route Worker requests to private services regardless of how those services are connected to Cloudflare: through a Cloudflare Tunnel from a cloud VPC, a Mesh node on a private subnet, or a Cloudflare WAN on-ramp from your data center or branch site.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "vpc_networks"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"PRIVATE_NETWORK"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "network_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf1:network"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">vpc_networks</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"PRIVATE_NETWORK"</span></span> <span class="line"><span class="nb-shiki-140thh">network_id = </span><span class="nb-shiki-mdbnqw">"cf1:network"</span></span> <span class="line"><span class="nb-shiki-140thh">remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>At runtime, the URL you pass to <code>fetch()</code> determines the destination:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Reach a service behind a Cloudflare WAN IPsec on-ramp</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">PRIVATE_NETWORK</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://10.50.0.100:8080/api"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>For destinations behind Cloudflare WAN on-ramps (GRE, IPsec, or CNI), your network must route the <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-cloudflare-source-ips/">Cloudflare source IP range</a> back through the on-ramp so reply traffic returns to Cloudflare. Without this route, stateful flows will fail. This is part of standard Cloudflare WAN onboarding.</p></div></div></aside> <p>For configuration options, refer to <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Networks</a>.</p>Thu, 21 May 2026 00:00:00 GMTWorkers VPCWorkers VPCDNS - New DNS records UX is rolling outhttps://developers.cloudflare.com/changelog/post/2026-05-20-new-dns-records-ux/https://developers.cloudflare.com/changelog/post/2026-05-20-new-dns-records-ux/<p>Starting today, everyone can opt in to a refreshed DNS records page in the Cloudflare dashboard. Over the coming weeks, the new experience will become the default for Free plan users first, followed by paid plans.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3706,height=2070,format=webp/_astro/new-dns-ux.Bfs_yXPa.png" alt="New DNS records UX" loading="lazy" decoding="async" width="3706" height="2070"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-new">What is new</h4><a class="anchor-link" href="#what-is-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Better table experience</strong>: resizable and hideable columns, row pinning, advanced filters with logical operators (AND/OR), configurable pagination, and expanded input fields so long values are no longer cut off.</li> <li><strong>First-class mobile experience</strong>: responsive layout with a touch-friendly, card-based UI and compact controls for small screens.</li> <li><strong>DNS quick reference</strong>: bite-sized explainers for DNS, proxy status, and TTL, available directly in the product to help users configure records without leaving the page.</li> <li><strong>Modern frontend</strong>: a refactor onto Cloudflare's new UI framework that improves performance and lays the foundation for future improvements.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=754,height=572,format=webp/_astro/new-dns-ux.DV6gCbme.gif" alt="New DNS records UX" loading="lazy" decoding="async" width="754" height="572"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rollout-plan">Rollout plan</h4><a class="anchor-link" href="#rollout-plan"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Dates are subject to change based on feedback received during the rollout.</p> <ul> <li><strong>20 May - 05 June</strong>: ramped rollout to Free, then Pro and Business plans.</li> <li><strong>08 June - 03 July</strong>: ramped rollout to Enterprise plans.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="share-your-feedback">Share your feedback</h4><a class="anchor-link" href="#share-your-feedback"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Once the new experience is turned on for your account, look for the feedback link at the top of the DNS records page in the Cloudflare dashboard and let us know what you think. Your input helps us prioritize the next round of improvements.</p>Wed, 20 May 2026 00:00:00 GMTDNSDNSRadar - Content type distribution and API traffic share on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-05-20-radar-content-type-and-api-traffic/https://developers.cloudflare.com/changelog/post/2026-05-20-radar-content-type-and-api-traffic/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes two new charts on the <a href="https://radar.cloudflare.com/traffic" target="_blank" rel="noopener">traffic page<span class="external-link"> ↗</span></a> that provide deeper insights into the composition of HTTP traffic: a content type distribution chart and an API traffic share chart.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="content-type-distribution">Content type distribution</h4><a class="anchor-link" href="#content-type-distribution"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://radar.cloudflare.com/traffic#content-type" target="_blank" rel="noopener"><strong>Content type</strong><span class="external-link"> ↗</span></a> chart displays the distribution of HTTP response content types, grouped into high-level categories. A traffic type selector allows filtering by human, bot, or all traffic. The existing <a href="https://radar.cloudflare.com/traffic#bot-vs-human" target="_blank" rel="noopener"><strong>Bot vs. Human</strong><span class="external-link"> ↗</span></a> chart also gained a content type category filter, allowing users to see the bot/human split for specific content categories.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/content-type-distribution.Dz2q1n6W.png" alt="Screenshot of the content type distribution chart on the Radar traffic page" loading="lazy" decoding="async" width="1600" height="878"> <p>Content type categories:</p> <ul> <li><strong>HTML</strong> — Web pages (<code>text/html</code>)</li> <li><strong>Images</strong> — All image formats (<code>image/*</code>)</li> <li><strong>JSON</strong> — JSON data and API responses (<code>application/json</code>, <code>*+json</code>)</li> <li><strong>JavaScript</strong> — Scripts (<code>application/javascript</code>, <code>text/javascript</code>)</li> <li><strong>CSS</strong> — Stylesheets (<code>text/css</code>)</li> <li><strong>Plain Text</strong> — Unformatted text (<code>text/plain</code>)</li> <li><strong>Fonts</strong> — Web fonts (<code>font/*</code>, <code>application/font-*</code>)</li> <li><strong>XML</strong> — XML documents and feeds (<code>text/xml</code>, <code>application/xml</code>, <code>application/rss+xml</code>, <code>application/atom+xml</code>)</li> <li><strong>YAML</strong> — Configuration files (<code>text/yaml</code>, <code>application/yaml</code>)</li> <li><strong>Video</strong> — Video content and streaming (<code>video/*</code>, <code>application/ogg</code>, <code>*mpegurl</code>)</li> <li><strong>Audio</strong> — Audio content (<code>audio/*</code>)</li> <li><strong>Markdown</strong> — Markdown documents (<code>text/markdown</code>)</li> <li><strong>Documents</strong> — PDFs, Office documents, ePub, CSV (<code>application/pdf</code>, <code>application/msword</code>, <code>text/csv</code>)</li> <li><strong>Binary</strong> — Executables, archives, WebAssembly (<code>application/octet-stream</code>, <code>application/zip</code>, <code>application/wasm</code>)</li> <li><strong>Serialization</strong> — Binary API formats (<code>application/protobuf</code>, <code>application/grpc</code>, <code>application/msgpack</code>)</li> <li><strong>Other</strong> — All other content types</li> </ul> <p>The <code>CONTENT_TYPE</code> dimension and <code>contentType</code> filter are available on the HTTP <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/summary_v2/">summary</a>, <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries_groups_v2/">timeseries groups</a>, and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries/">timeseries</a> endpoints.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-traffic-share">API traffic share</h4><a class="anchor-link" href="#api-traffic-share"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://radar.cloudflare.com/traffic#api-traffic" target="_blank" rel="noopener"><strong>API traffic</strong><span class="external-link"> ↗</span></a> chart shows the percentage of dynamic (non-cacheable) HTTP request traffic that is API-related. API traffic is identified by JSON or XML response content types (<code>application/json</code>, <code>application/xml</code>, <code>text/xml</code>) on HTTP requests that returned a 200 status code. A traffic type selector allows switching between human traffic, bot traffic, or all traffic.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1006,format=webp/_astro/api-traffic-share._xl0TThn.png" alt="Screenshot of the API traffic share chart on the Radar traffic page" loading="lazy" decoding="async" width="1600" height="1006"> <p>The <code>API_TRAFFIC</code> dimension is available on the existing HTTP <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/summary_v2/">summary</a> and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries_groups_v2/">timeseries groups</a> endpoints. An <code>apiTraffic</code> filter (<code>API</code> or <code>NON_API</code>) can also be applied to <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries/">HTTP timeseries</a> requests to retrieve raw request counts for API-only or non-API traffic.</p> <p>Visit the <a href="https://radar.cloudflare.com/traffic" target="_blank" rel="noopener">Radar traffic page<span class="external-link"> ↗</span></a> to explore these new charts.</p>Wed, 20 May 2026 00:00:00 GMTRadarRadarWAF - WAF Release - 2026-05-20https://developers.cloudflare.com/changelog/post/2026-05-20-waf-release/https://developers.cloudflare.com/changelog/post/2026-05-20-waf-release/ <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <p><strong>Continuous Rule Improvements</strong></p> <p>We are continuously refining our managed rules to provide more resilient protection and deeper insights into attack patterns. To ensure an optimal security posture, we recommend consistently monitoring the Security Events dashboard and adjusting rule actions as these enhancements are deployed.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bcdcec3ea63a480896513dc39e9c068d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9e9c068d</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Sitecore - Cache Poisoning - CVE:CVE-2025-53693 Beta</td><td>N/A</td><td>Block</td><td><p>This rule is merged into the original rule "Sitecore - Cache Poisoning - CVE:CVE-2025-53693" (ID: <rule-id id="d1bd7563e6254db48ce703807c5b669c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7c5b669c</span></button></rule-id>).</p></td></tr></tbody></table>Wed, 20 May 2026 00:00:00 GMTWAFWAFAccess - Cloudflare as identity provider and account membership selectorhttps://developers.cloudflare.com/changelog/post/2026-05-19-cloudflare-as-identity-provider/https://developers.cloudflare.com/changelog/post/2026-05-19-cloudflare-as-identity-provider/<p>Cloudflare Access now supports using Cloudflare itself as an <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/">identity provider</a>. If you publish an Access application and select Cloudflare as the login method, users can sign in with their existing Cloudflare account — no one-time PINs, no third-party IdP configuration, and no shared email inboxes. Authentication is backed by Cloudflare's own account security (including multi-factor authentication), making it both simpler to set up and more secure than OTP-based login for most use cases.</p> <p>Cloudflare is now the <strong>default identity provider for all newly created Zero Trust accounts</strong>, replacing One-time PIN.</p> <p>This also enables two new capabilities:</p> <ul> <li><strong>Cloudflare Account Member selector</strong> — A new <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#cloudflare-access-selectors">policy selector</a> that matches users based on their membership in a Cloudflare account. You can target the current account or specify a different account ID for cross-account access scenarios.</li> <li><strong>Restrict to account members</strong> — An identity provider configuration option that limits authentication to users who are members of your Cloudflare account.</li> </ul> <p>To get started, add Cloudflare as an <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/">identity provider</a> in your Zero Trust settings.</p>Tue, 19 May 2026 00:00:00 GMTAccessAccessArtifacts, Queues - Event subscriptions for Artifacts lifecycle eventshttps://developers.cloudflare.com/changelog/post/2026-05-19-event-subscriptions/https://developers.cloudflare.com/changelog/post/2026-05-19-event-subscriptions/<p>You can now receive <a href="https://developers.cloudflare.com/queues/event-subscriptions/">event notifications</a> for <a href="https://developers.cloudflare.com/artifacts/">Artifacts</a> repository changes and consume them from a Worker to build commit-driven automation.</p> <p>This allows you to:</p> <ul> <li>Run custom workflows when a repository is created or imported</li> <li>Kick off a build and deploy a change when an agent pushes to a repo</li> <li>Trigger a review agent on every push</li> </ul> <p>Available events include:</p> <ul> <li><strong>Account-level events</strong> (<code>artifacts</code> source) — <code>repo.created</code>, <code>repo.deleted</code>, <code>repo.forked</code>, <code>repo.imported</code></li> <li><strong>Repository-level events</strong> (<code>artifacts.repo</code> source) — <code>pushed</code>, <code>cloned</code>, <code>fetched</code></li> </ul> <p>To learn more, refer to <a href="https://developers.cloudflare.com/artifacts/guides/event-subscriptions/">Artifacts documentation</a>.</p>Tue, 19 May 2026 00:00:00 GMTArtifactsArtifactsQueuesCASB - CASB adds support for Claude Compliance APIhttps://developers.cloudflare.com/changelog/post/2026-05-19-casb-claude-compliance-api/https://developers.cloudflare.com/changelog/post/2026-05-19-casb-claude-compliance-api/<p><a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/anthropic/">Cloudflare CASB</a> now integrates with the <a href="https://support.claude.com/en/articles/13015708-access-the-compliance-api" target="_blank" rel="noopener">Claude Compliance API<span class="external-link"> ↗</span></a>. This enhancement gives security teams visibility into Claude usage patterns, admin activity, and compliance-relevant events across their organization.</p> <p>The Claude Compliance API provides structured access to audit logs and administrative actions within Claude Enterprise and Claude Platform. Cloudflare CASB ingests this data to surface security findings that help organizations enhance their security posture and enforce AI governance.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Starting today, security teams can scan for security findings across the following assets:</p> <ul> <li><strong>Public projects</strong> — Projects set to public visibility</li> <li><strong>Project attachment</strong> — Files and documents added to projects that violate DLP policies</li> <li><strong>Chat files</strong> — User-uploaded and provider-generated files that violate DLP policies</li> <li><strong>Chat messages</strong> — User prompts and provider responses that violate DLP policies</li> <li><strong>Artifacts</strong> — Provider-generated documents and files that violate DLP policies</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/anthropic/">integration</a> is available to all Cloudflare One customers. New Cloudflare customers can sign up and start with their first two integrations for free. Existing customers can enable the integration directly in the dashboard. The integration begins scanning immediately and surfaces findings in the dashboard within minutes.</p>Tue, 19 May 2026 00:00:00 GMTCASBCASBRadar - MRT Explorer on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-05-19-radar-mrt-explorer/https://developers.cloudflare.com/changelog/post/2026-05-19-radar-mrt-explorer/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes an <a href="https://radar.cloudflare.com/routing/mrt-explorer" target="_blank" rel="noopener">MRT Explorer<span class="external-link"> ↗</span></a> tool in the Routing section. Route collectors like RIPE RIS and RouteViews publish MRT (Multi-Threaded Routing Toolkit) dump files containing BGP announcements, withdrawals, and route attributes. The new tool parses these files entirely in the browser — nothing gets uploaded.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="loading-a-file">Loading a file</h4><a class="anchor-link" href="#loading-a-file"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Paste a URL to fetch an MRT file remotely, drag and drop one onto the page, or browse for a local file. Gzip and bzip2 compressed files are supported. A sample file is also available to get started right away.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2428,height=898,format=webp/_astro/mrt-explorer-form.DKnzUqMC.png" alt="Screenshot of the MRT Explorer file input form" loading="lazy" decoding="async" width="2428" height="898"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="inspecting-events">Inspecting events</h4><a class="anchor-link" href="#inspecting-events"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Once parsed, the tool lists every BGP event with its timestamp, prefix, AS path, OTC (Only to Customer), and community attributes.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2410,height=1536,format=webp/_astro/mrt-explorer-list.8fq2u5Kc.png" alt="Screenshot of the MRT Explorer event list" loading="lazy" decoding="async" width="2410" height="1536"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="event-details">Event details</h4><a class="anchor-link" href="#event-details"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Clicking on the "View details" action opens a modal with additional properties and the full event JSON.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1694,height=1890,format=webp/_astro/mrt-explorer-details.EMcHevWw.png" alt="Screenshot of the MRT Explorer event details modal" loading="lazy" decoding="async" width="1694" height="1890"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="shareable-urls">Shareable URLs</h4><a class="anchor-link" href="#shareable-urls"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When loading a file by URL, the query string captures the source so the link can be shared directly — the recipient's browser immediately fetches and parses the same file.</p> <p>Try the <a href="https://radar.cloudflare.com/routing/mrt-explorer" target="_blank" rel="noopener">MRT Explorer on Cloudflare Radar<span class="external-link"> ↗</span></a>.</p>Tue, 19 May 2026 00:00:00 GMTRadarRadarArtifacts - Manage Artifacts namespaces and repos with Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-05-18-wrangler-support/https://developers.cloudflare.com/changelog/post/2026-05-18-wrangler-support/<p>You can now manage <a href="https://developers.cloudflare.com/artifacts/">Artifacts</a> namespaces, repos, and repo-scoped tokens directly from Wrangler CLI.</p> <p>Available commands:</p> <ul> <li><code>wrangler artifacts namespaces list</code> — List Artifacts namespaces in your account.</li> <li><code>wrangler artifacts namespaces get</code> — Get metadata for a namespace.</li> <li><code>wrangler artifacts repos create</code> — Create a repo in a namespace.</li> <li><code>wrangler artifacts repos list</code> — List repos in a namespace.</li> <li><code>wrangler artifacts repos get</code> — Get metadata for a repo.</li> <li><code>wrangler artifacts repos delete</code> — Delete a repo.</li> <li><code>wrangler artifacts repos issue-token</code> — Issue a repo-scoped token for Git access.</li> </ul> <p>To get started, refer to the <a href="https://developers.cloudflare.com/workers/wrangler/commands/artifacts/">Wrangler Artifacts commands documentation</a>.</p>Mon, 18 May 2026 00:00:00 GMTArtifactsArtifactsCloudflare WAN, Magic Transit - Network Analytics support for Unified Routinghttps://developers.cloudflare.com/changelog/post/2026-05-18-unified-routing-network-analytics/https://developers.cloudflare.com/changelog/post/2026-05-18-unified-routing-network-analytics/<p><a href="https://developers.cloudflare.com/analytics/network-analytics/">Network Analytics</a> is now fully supported for accounts using <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta">Unified Routing</a> mode. Traffic that traverses Unified Routing onramps and offramps is now visible in Network Analytics with the same dimensions and filters as traffic on the standard data plane.</p> <p>This closes a parity gap for customers who had moved tunnels onto Unified Routing and lost visibility into their dataplane traffic in the Network Analytics dashboard. No configuration change is required — analytics data is collected automatically for all accounts with Unified Routing enabled.</p> <p>For the remaining beta limitations, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations">Traffic steering beta limitations</a>.</p>Mon, 18 May 2026 00:00:00 GMTCloudflare WANCloudflare WANMagic TransitWorkers - Share local dev servers through Cloudflare Tunnel in Wrangler and Vitehttps://developers.cloudflare.com/changelog/post/2026-05-18-local-dev-tunnels/https://developers.cloudflare.com/changelog/post/2026-05-18-local-dev-tunnels/<p>You can now share local dev sessions through <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a> and get a public URL when using either <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> or the <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a>. This is useful when you need to share a preview, test a webhook, or access your app from another device.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1000,height=678,format=webp/_astro/vite-local-dev-tunnel.CW4xpgIR.gif" alt="Vite local dev tunnel demo" loading="lazy" decoding="async" width="1000" height="678"> <p>This lets you either:</p> <ul> <li>start a temporary <a href="https://developers.cloudflare.com/tunnel/setup/#quick-tunnels-development">Quick tunnel</a> with a random <code>*.trycloudflare.com</code> hostname, or</li> <li>use an existing <a href="https://developers.cloudflare.com/tunnel/setup/#create-a-tunnel">named tunnel</a> for a stable hostname and to restrict access with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/">Cloudflare Access</a>.</li> </ul> <p>To start a tunnel, press <code>t</code> in Wrangler or <code>t + Enter</code> in Vite while your dev server is running. For details on setting up a named tunnel, refer to <a href="https://developers.cloudflare.com/workers/local-development/local-dev-tunnels/">Share a local dev server</a>.</p>Mon, 18 May 2026 00:00:00 GMTWorkersWorkersHyperdrive, Workers - Hyperdrive exposes database connection pool size metricshttps://developers.cloudflare.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/https://developers.cloudflare.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/<p>You can now view the size of your Hyperdrive database connection pools, giving you the ability to self-diagnose connection issues. Using the Cloudflare dashboard or the <code>hyperdrivePoolSizesAdaptiveGroups</code> dataset in the <a href="https://developers.cloudflare.com/analytics/graphql-api/getting-started/">GraphQL Analytics API</a>, you can see <code>waitingClients</code>, <code>currentPoolSize</code>, <code>availablePoolSlots</code>, and <code>maxPoolSize</code> for each of your configurations.</p> <p>A new <strong>Pool connections</strong> chart has been added to the <strong>Metrics</strong> tab of each Hyperdrive configuration in the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>. You can use the location selector to drill down into specific locations hosting your connection pool by airport code.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2604,height=890,format=webp/_astro/hyperdrive-pool-size-metrics-chart.DZxLTFgB.png" alt="Hyperdrive pool size metrics chart" loading="lazy" decoding="async" width="2604" height="890"> <p>The chart shows:</p> <ul> <li><strong>Waiting clients</strong>: Client requests waiting for an available connection.</li> <li><strong>Open connections</strong>: Active connections to your database.</li> <li><strong>Pool size maximum</strong>: Your configured origin connection limit.</li> </ul> <p>Connection contention appears as a spike in waiting clients, or when open connections consistently approach the pool size maximum. If your open connections regularly approach this limit, consider contacting Cloudflare to <a href="https://developers.cloudflare.com/hyperdrive/platform/limits/#request-a-limit-increase">increase your Hyperdrive connection limit</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pool-size-metrics">Pool size metrics</h4><a class="anchor-link" href="#pool-size-metrics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>hyperdrivePoolSizesAdaptiveGroups</code> dataset in the <a href="https://developers.cloudflare.com/analytics/graphql-api/getting-started/">GraphQL Analytics API</a> exposes the following key connection pool metrics for each Hyperdrive configuration:</p> <p>Under <code>avg</code>:</p> <ul> <li><strong><code>currentPoolSize</code></strong> — Average number of connections currently open in the pool.</li> <li><strong><code>availablePoolSlots</code></strong> — Average number of pool connections available for checkout.</li> <li><strong><code>waitingClients</code></strong> — Average number of clients waiting for a connection from the pool.</li> </ul> <p>Under <code>max</code>:</p> <ul> <li><strong><code>maxPoolSize</code></strong> — Configured maximum size of the connection pool.</li> <li><strong><code>currentPoolSize</code></strong> — Peak number of connections open in the pool.</li> <li><strong><code>waitingClients</code></strong> — Peak number of clients waiting for a connection from the pool.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/hyperdrive/observability/metrics/">Metrics and analytics</a> and <a href="https://developers.cloudflare.com/hyperdrive/concepts/connection-pooling/">Connection pooling</a>.</p>Fri, 15 May 2026 00:00:00 GMTHyperdriveHyperdriveWorkersR2 SQL - R2 SQL now supports JOINs, subqueries, and multi-table querieshttps://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/https://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/<p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> is Cloudflare's serverless, distributed SQL engine for querying <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>. R2 SQL runs directly on Cloudflare's global network with no infrastructure to manage, so you can analyze data in R2 without exporting it to an external warehouse.</p> <p>R2 SQL now supports joining multiple Iceberg tables in a single query. You can combine tables with JOINs, filter with subqueries, and define multi-table CTEs to build complex analytical queries.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-capabilities">New capabilities</h4><a class="anchor-link" href="#new-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>JOINs</strong> — <code>INNER JOIN</code>, <code>LEFT JOIN</code>, <code>RIGHT JOIN</code>, <code>FULL OUTER JOIN</code>, <code>CROSS JOIN</code>, and implicit joins (comma-separated <code>FROM</code> with conditions in <code>WHERE</code>)</li> <li><strong>Subqueries</strong> — <code>IN</code> / <code>NOT IN</code>, <code>EXISTS</code> / <code>NOT EXISTS</code>, scalar subqueries in <code>SELECT</code> / <code>WHERE</code> / <code>HAVING</code>, and derived tables (subqueries in <code>FROM</code>)</li> <li><strong>Multi-table CTEs</strong> — <code>WITH</code> clauses can reference different tables and include JOINs</li> <li><strong>Self-joins</strong> — join a table with itself using different aliases</li> <li><strong>Multi-way joins</strong> — join three or more tables in a single query</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="two-table-join-with-aggregation">Two-table JOIN with aggregation</h4><a class="anchor-link" href="#two-table-join-with-aggregation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">domain</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">plan</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> request_count</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zones</span><span class="nb-shiki-140thh"> z</span></span> <span class="line"><span class="nb-shiki-1itgoe">INNER JOIN</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">http_requests</span><span class="nb-shiki-140thh"> h </span><span class="nb-shiki-1itgoe">ON</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> h</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">plan</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'enterprise'</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">domain</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">plan</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-140thh"> request_count </span><span class="nb-shiki-1itgoe">DESC</span></span> <span class="line"><span class="nb-shiki-1itgoe">LIMIT</span><span class="nb-shiki-dzsirb"> 20</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="exists-subquery"><code>EXISTS</code> subquery</h4><a class="anchor-link" href="#exists-subquery"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">domain</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">plan</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zones</span><span class="nb-shiki-140thh"> z</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-1itgoe"> EXISTS</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> SELECT</span><span class="nb-shiki-dzsirb"> 1</span><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">firewall_events</span><span class="nb-shiki-140thh"> f</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-dzsirb"> f</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span><span class="nb-shiki-1itgoe"> AND</span><span class="nb-shiki-dzsirb"> f</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">action</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'block'</span></span> <span class="line"><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-dzsirb"> z</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">domain</span></span> <span class="line"><span class="nb-shiki-1itgoe">LIMIT</span><span class="nb-shiki-dzsirb"> 20</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="multi-table-cte-with-join">Multi-table CTE with JOIN</h4><a class="anchor-link" href="#multi-table-cte-with-join"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">WITH</span><span class="nb-shiki-140thh"> top_zones </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> SELECT</span><span class="nb-shiki-140thh"> zone_id, </span><span class="nb-shiki-dzsirb">COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> req_count</span></span> <span class="line"><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">http_requests</span></span> <span class="line"><span class="nb-shiki-1itgoe"> GROUP BY</span><span class="nb-shiki-140thh"> zone_id</span></span> <span class="line"><span class="nb-shiki-1itgoe"> ORDER BY</span><span class="nb-shiki-140thh"> req_count </span><span class="nb-shiki-1itgoe">DESC</span></span> <span class="line"><span class="nb-shiki-1itgoe"> LIMIT</span><span class="nb-shiki-dzsirb"> 50</span></span> <span class="line"><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh">zone_threats </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> SELECT</span><span class="nb-shiki-140thh"> zone_id, </span><span class="nb-shiki-dzsirb">COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> threat_count</span></span> <span class="line"><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">firewall_events</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-140thh"> risk_score </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">5</span></span> <span class="line"><span class="nb-shiki-1itgoe"> GROUP BY</span><span class="nb-shiki-140thh"> zone_id</span></span> <span class="line"><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-dzsirb"> tz</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">tz</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">req_count</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">COALESCE</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">zt</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">threat_count</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> threat_count</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> top_zones tz</span></span> <span class="line"><span class="nb-shiki-1itgoe">LEFT JOIN</span><span class="nb-shiki-140thh"> zone_threats zt </span><span class="nb-shiki-1itgoe">ON</span><span class="nb-shiki-dzsirb"> tz</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> zt</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">zone_id</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-dzsirb"> tz</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">req_count</span><span class="nb-shiki-1itgoe"> DESC</span></span> <span class="line"><span class="nb-shiki-1itgoe">LIMIT</span><span class="nb-shiki-dzsirb"> 20</span></span></code></pre></figure> <p>For the full syntax reference, refer to the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. For performance guidance with joins, refer to <a href="https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/">Limitations and best practices</a>.</p>Fri, 15 May 2026 00:00:00 GMTR2 SQLR2 SQLWAF - WAF Release - 2026-05-15 - Emergencyhttps://developers.cloudflare.com/changelog/post/2026-05-15-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2026-05-15-emergency-waf-release/ <p>This emergency release introduces two new rules to detect nginx heap buffer overflow and heap spray exploitation attempts targeting the rewrite module's <code>is_args</code> stale-state bug (CVE-2026-42945).</p> <p><strong>Key Findings</strong></p> <p>CVE-2026-42945: nginx Heap Buffer Overflow via Stale <code>is_args</code> in Rewrite Module</p> <p>Successful exploitation allows remote attackers to trigger a heap buffer overflow in nginx's rewrite module by sending crafted URIs containing escapable characters. A length/copy pass mismatch in <code>ngx_http_script_copy_capture_code()</code> causes the copy pass to write escaped data into an undersized buffer, leading to heap corruption. This enables denial of service (worker process crash) and, with heap feng shui techniques, potential remote code execution.</p> <p>We strongly recommend upgrading to nginx 1.30.1 (or later) immediately to address the underlying vulnerability. If you cannot upgrade immediately, avoid <code>rewrite</code> directives with <code>?</code> in the replacement string followed by <code>set</code> or <code>if</code> referencing capture groups.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2013e3e58efe4b79a26e214f7e52be73"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7e52be73</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>nginx - Remote Code Execution - Buffer Overread - CVE:CVE-2026-42945</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="68226e83a4d14ee9a9c878469df0ee6c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9df0ee6c</span></button></rule-id></td><td>N/A</td><td>nginx - Remote Code Execution - Heap Spray - CVE:CVE-2026-42945</td><td>N/A</td><td>Block</td><td><p>This is a new detection.</p></td></tr></tbody></table>Fri, 15 May 2026 00:00:00 GMTWAFWAFWorkers - New Domains tab in the Workers dashboardhttps://developers.cloudflare.com/changelog/post/2026-05-14-domains-tab/https://developers.cloudflare.com/changelog/post/2026-05-14-domains-tab/ <p>In your Worker's dashboard, there is now a dedicated <strong>Domains</strong> tab where you can purchase a new domain through Cloudflare Registrar and have it automatically connected, add an <a href="https://developers.cloudflare.com/workers/configuration/routing/custom-domains/">existing domain</a>, and manage all of your Worker's routing in one place.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1678,height=1026,format=webp/_astro/domains-tab.Cey2Oyr-.png" alt="The new Domains tab in the Workers dashboard" loading="lazy" decoding="async" width="1678" height="1026"> <p>You can also enable or disable your <a href="https://developers.cloudflare.com/workers/configuration/routing/workers-dev/"><code>workers.dev</code> subdomain</a> and <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">Preview URLs</a>, put them behind <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/">Cloudflare Access</a> to require sign-in, and jump directly to <a href="https://developers.cloudflare.com/analytics/">analytics</a> or domain overview for any connected domain.</p> <p>To get started, go to <strong>Workers &amp; Pages</strong>, select a Worker, and open the <strong>Domains</strong> tab.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Workers &amp; Pages</strong>&nbsp;&#8599;</a>Thu, 14 May 2026 00:00:00 GMTWorkersWorkersAgents, Workers - Agents SDK v0.12.4: chat recovery, routing retries, durable Think submissions, and Voice connection controlhttps://developers.cloudflare.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/https://developers.cloudflare.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> brings more reliable chat recovery, fixes Agent state synchronization during reconnects, adds durable submissions for Think, exposes routing retry configuration, and adds connection control for Voice agents.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="chat-recovery-improvements">Chat recovery improvements</h4><a class="anchor-link" href="#chat-recovery-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/ai-chat</code> now keeps server turns running when a browser or client stream is interrupted. This is useful for long-running AI responses where users refresh the page, close a tab, or temporarily lose connection. Calling <code>stop()</code> still cancels the server turn.</p> <p>Set <code>cancelOnClientAbort: true</code> if browser or client aborts should also cancel the server turn:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> chat</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"assistant"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cancelOnClientAbort: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="tsx"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tsx" data-nb-lang="tsx"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> chat</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"assistant"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cancelOnClientAbort: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Notable bug fixes:</p> <ul> <li>Chat stream resume negotiation no longer throws when replay races with a closed WebSocket connection.</li> <li>Recovered chat continuations no longer leave <code>useAgentChat</code> stuck in a streaming state when the original socket disconnects before a terminal response.</li> <li>Approval auto-continuation preserves reasoning parts and persists continuation reasoning in the final message.</li> <li><code>isServerStreaming</code> now resets correctly when a resumed stream moves from the fallback observer path to a transport-owned stream.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agent-state-and-routing-fixes">Agent state and routing fixes</h4><a class="anchor-link" href="#agent-state-and-routing-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>agents@0.12.4</code> prevents duplicate initial state frames during WebSocket connection setup. This avoids stale initial state messages overwriting state updates already sent by the client.</p> <p>Agent recovery is also more reliable when tool calls span a Durable Object restart. Recovery now defers user finish hooks until after agent startup and isolates hook failures, so one failed hook does not block other recovered runs from finalizing.</p> <p><code>getAgentByName()</code> now supports <code>routingRetry</code> for transient Durable Object routing failures:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { getAgentByName } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> getAgentByName</span><span class="nb-shiki-140thh">(env.AssistantAgent, </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> routingRetry: {</span></span> <span class="line"><span class="nb-shiki-140thh"> maxAttempts: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { getAgentByName } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> getAgentByName</span><span class="nb-shiki-140thh">(env.AssistantAgent, </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> routingRetry: {</span></span> <span class="line"><span class="nb-shiki-140thh"> maxAttempts: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="durable-think-submissions">Durable Think submissions</h4><a class="anchor-link" href="#durable-think-submissions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/think</code> now supports durable programmatic submissions. <code>submitMessages()</code> provides durable acceptance, idempotent retries, status inspection, cancellation, and cleanup for server-driven turns that should continue after the caller returns.</p> <p><code>Think.chat()</code> RPC turns now run inside chat recovery fibers and persist their stream chunks. Interrupted sub-agent turns can recover partial output instead of starting over.</p> <p><code>ChatOptions.tools</code> has been removed from the TypeScript API. Define durable tools on the child agent or use agent tools for orchestration. Runtime <code>options.tools</code> values passed by legacy callers are ignored with a warning.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="think-message-pruning-behavior-change">Think message pruning behavior change</h4><a class="anchor-link" href="#think-message-pruning-behavior-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/think</code> no longer applies <code>pruneMessages({ toolCalls: "before-last-2-messages" })</code> to model context by default. The previous default could strip client-side tool results from longer multi-turn flows.</p> <p><code>truncateOlderMessages</code> still runs as before, so context cost remains bounded. Subclasses that relied on the old aggressive pruning can opt back in from <code>beforeTurn</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { pruneMessages } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> beforeTurn</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: </span><span class="nb-shiki-1t8gfj">pruneMessages</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: ctx.messages,</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCalls: </span><span class="nb-shiki-mdbnqw">"before-last-2-messages"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Think } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/think"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { pruneMessages } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Think</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> beforeTurn</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: </span><span class="nb-shiki-1t8gfj">pruneMessages</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: ctx.messages,</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCalls: </span><span class="nb-shiki-mdbnqw">"before-last-2-messages"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="voice-agent-connection-control">Voice agent connection control</h4><a class="anchor-link" href="#voice-agent-connection-control"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>@cloudflare/voice</code> adds an <code>enabled</code> option to <code>useVoiceAgent</code>. React apps can now delay creating and connecting a <code>VoiceClient</code> until prerequisites such as capability tokens are ready.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> voice</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useVoiceAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"MyVoiceAgent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled: </span><span class="nb-shiki-1t8gfj">Boolean</span><span class="nb-shiki-140thh">(token),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="tsx"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tsx" data-nb-lang="tsx"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> voice</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useVoiceAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"MyVoiceAgent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled: </span><span class="nb-shiki-1t8gfj">Boolean</span><span class="nb-shiki-140thh">(token),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>This release also fixes Workers AI speech-to-text session edge cases and <code>withVoice</code> text streaming from AI SDK <code>textStream</code> responses.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Streamable HTTP routing</strong> — Server-to-client requests now route through the originating POST stream when no standalone SSE stream is available.</li> <li><strong>Structured tool output</strong> — Tool output shapes are preserved when truncating older messages or oversized persisted rows.</li> <li><strong>Non-chat Think tool steps</strong> — Think agent-tool children can complete without emitting assistant text and can return structured output through <code>getAgentToolOutput</code>.</li> <li><strong>Sub-agent schedules</strong> — Stale sub-agent schedule rows are pruned when their owning facet registry entry no longer exists.</li> <li><strong><code>@cloudflare/codemode</code></strong> — Adds a browser-safe export with an iframe sandbox executor and resolves OpenAPI specs inside the sandbox to avoid Worker Loader RPC size limits.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/ai-chat@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/think@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/voice@latest</span></span></code></pre></figure> <p>Refer to the <a href="https://developers.cloudflare.com/agents/runtime/">Agents API reference</a> and <a href="https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/">Chat agents documentation</a> for more information.</p>Wed, 13 May 2026 00:00:00 GMTAgentsAgentsWorkersLogs - New Logpush datasets and updated fields across multiple Logpush datasets in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2026-05-13-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-05-13-log-fields-updated/<p>Cloudflare has updated <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-datasets">New datasets</h4><a class="anchor-link" href="#new-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Email Security Post-Delivery Events</strong>: A new dataset with fields including <code>AlertID</code>, <code>CompletedAt</code>, <code>Destination</code>, <code>FinalDisposition</code>, <code>Folder</code>, <code>From</code>, <code>FromName</code>, <code>MessageID</code>, <code>MessageTimestamp</code>, <code>MicrosoftTenantID</code>, <code>Operation</code>, <code>PostfixID</code>, <code>Reasons</code>, <code>Recipient</code>, <code>RequestedAt</code>, <code>RequestedBy</code>, <code>RequestedDisposition</code>, <code>Status</code>, <code>Subject</code>, <code>Success</code>, and <code>To</code>.</li> <li><strong>Magic Network Monitoring Flow Logs</strong>: A new dataset with fields including <code>AWSVPCFlowJSON</code>, <code>Bits</code>, <code>DestinationAS</code>, <code>DestinationAddress</code>, <code>DestinationPort</code>, <code>DeviceID</code>, <code>EgressBits</code>, <code>EgressPackets</code>, <code>Ethertype</code>, <code>FlowProtocol</code>, <code>FlowTimestamp</code>, <code>NumFlows</code>, <code>PacketID</code>, <code>Packets</code>, <code>Protocol</code>, <code>RuleIDs</code>, <code>SampleRate</code>, <code>SampleRateType</code>, <code>SamplerAddress</code>, <code>SourceAS</code>, <code>SourceAddress</code>, <code>SourcePort</code>, <code>TcpFlags</code>, and <code>Timestamp</code>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updated-fields-in-existing-datasets">Updated fields in existing datasets</h4><a class="anchor-link" href="#updated-fields-in-existing-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Firewall events</strong> (added): <code>AISecurityInjectionScore</code>, <code>AISecurityPIICategories</code>, <code>AISecurityTokenCount</code>, and <code>AISecurityUnsafeTopicCategories</code>.</li> <li><strong>HTTP requests</strong> (added): <code>AISecurityInjectionScore</code>, <code>AISecurityPIICategories</code>, <code>AISecurityTokenCount</code>, <code>AISecurityUnsafeTopicCategories</code>, and <code>Subrequests</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Wed, 13 May 2026 00:00:00 GMTLogsLogsCloudflare Web Analytics - /cdn-cgi/rum endpoint now returns 405 for non-POST requestshttps://developers.cloudflare.com/changelog/post/2026-05-13-rum-405-method-not-allowed/https://developers.cloudflare.com/changelog/post/2026-05-13-rum-405-method-not-allowed/<p>The <code>/cdn-cgi/rum</code> beacon endpoint now returns <code>405 Method Not Allowed</code> for non-POST requests instead of <code>404 Not Found</code>. The response includes an <code>Allow: POST, OPTIONS</code> header per <a href="https://www.rfc-editor.org/rfc/rfc9110#section-15.5.6" target="_blank" rel="noopener">RFC 9110 §15.5.6<span class="external-link"> ↗</span></a>.</p> <p>Previously, sending a <code>GET</code> or other non-POST request to this endpoint returned a <code>404</code>, which was misleading because it suggested the endpoint did not exist. The new <code>405</code> response clearly indicates that the endpoint exists but only accepts <code>POST</code> requests.</p> <p>The Web Analytics beacon (<code>beacon.min.js</code>) already uses <code>POST</code> for all metric submissions, so this change does not affect normal beacon operation. <code>OPTIONS</code> requests for CORS preflight continue to work as before.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/web-analytics/faq/#why-am-i-getting-a-405-method-not-allowed-error-from-cdn-cgirum">Web Analytics FAQ</a>.</p>Wed, 13 May 2026 00:00:00 GMTCloudflare Web AnalyticsCloudflare Web AnalyticsCloudflare One, Access - Refreshed Access login pagehttps://developers.cloudflare.com/changelog/post/2026-05-12-access-login-page-refresh/https://developers.cloudflare.com/changelog/post/2026-05-12-access-login-page-refresh/<p>The <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/custom-pages/access-login-page/">Access login page</a> and <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/one-time-pin/">one-time password (OTP)</a> page now feature a refreshed design that improves visual consistency, user trust, and mobile responsiveness.</p> <p><strong>Before:</strong></p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=532,height=906,format=webp/_astro/access-login-old.CwNVkCQH.png" alt="Screenshot of the previous Access login page" loading="lazy" decoding="async" width="532" height="906"> <p><strong>After:</strong></p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=541,height=722,format=webp/_astro/access-login-new.Y7WUfg9G.png" alt="Screenshot of the updated Access login page" loading="lazy" decoding="async" width="541" height="722"> <p>The updated login experience includes:</p> <ul> <li><strong>Unified authentication card</strong> - All sign-in options (identity provider buttons, email input, OTP) now appear in a single card with consistent styling, replacing the previous multi-section layout.</li> <li><strong>Consistent button styling</strong> - Identity provider buttons use a uniform size and layout for easier scanning and selection.</li> <li><strong>Better mobile experience</strong> - Responsive layout improvements ensure the login page renders correctly on phones and tablets.</li> <li><strong>Dark mode support</strong> - The login page now supports dark mode.</li> </ul>Tue, 12 May 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessCloudflare WAN, Magic Transit, Cloudflare One - New accounts assigned a single IPv4 anycast addresshttps://developers.cloudflare.com/changelog/post/2026-05-12-single-anycast-ip-default/https://developers.cloudflare.com/changelog/post/2026-05-12-single-anycast-ip-default/<p>New Magic Transit and Cloudflare WAN accounts are now assigned a single IPv4 anycast address by default.</p> <p>Cloudflare handles failures on its network automatically by advertising your endpoint IP from multiple nodes across many globally distributed data centers. To handle failures on your network, configure two tunnels from separate routers.</p> <p>To request additional anycast IP addresses for your account, contact your account team.</p> <p>For tunnel configuration guidance, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-tunnel-endpoints/">Configure tunnel endpoints</a> for Cloudflare WAN or <a href="https://developers.cloudflare.com/magic-transit/how-to/configure-tunnel-endpoints/">Configure tunnel endpoints</a> for Magic Transit.</p>Tue, 12 May 2026 00:00:00 GMTCloudflare WANCloudflare WANMagic TransitCloudflare OneContainers - SSH through Wrangler is now enabled by default for Containershttps://developers.cloudflare.com/changelog/post/2026-05-12-ssh-enabled-by-default/https://developers.cloudflare.com/changelog/post/2026-05-12-ssh-enabled-by-default/ <p>SSH through Wrangler is now enabled by default for <a href="https://developers.cloudflare.com/containers/">Containers</a>. Previously, you had to set <code>ssh.enabled</code> to <code>true</code> in your Container configuration before you could connect.</p> <p>This change does not expose any publicly accessible ports on your Container. The SSH service is reachable only through <a href="https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-ssh"><code>wrangler containers ssh</code></a>, which authenticates against your Cloudflare account. You also need to add an <code>ssh-ed25519</code> public key to <code>authorized_keys</code> before anyone can connect, so enabling SSH alone does not grant access.</p> <p>To connect, add a public key to your Container configuration and run <code>wrangler containers ssh &lt;INSTANCE_ID&gt;</code>:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "authorized_keys"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;NAME>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "public_key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;YOUR_PUBLIC_KEY_HERE>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">authorized_keys</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"&#x3C;NAME>"</span></span> <span class="line"><span class="nb-shiki-140thh">public_key = </span><span class="nb-shiki-mdbnqw">"&#x3C;YOUR_PUBLIC_KEY_HERE>"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>To disable SSH, set <code>ssh.enabled</code> to <code>false</code> in your Container configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ssh"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">ssh</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">enabled = </span><span class="nb-shiki-dzsirb">false</span></span></code></pre></figure></div></div></div> <p>For more information, refer to the <a href="https://developers.cloudflare.com/containers/ssh/">SSH documentation</a>.</p>Tue, 12 May 2026 00:00:00 GMTContainersContainersGateway - Create Gateway firewall policies with natural languagehttps://developers.cloudflare.com/changelog/post/2026-05-12-natural-language-policy-creation/https://developers.cloudflare.com/changelog/post/2026-05-12-natural-language-policy-creation/<p>Cloudflare Gateway now supports natural language policy creation for <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/">DNS</a>, <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP</a>, and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network</a> firewall policies. Administrators can describe the outcome they want in plain language, and Cloudflare will generate a complete policy rule that populates the policy builder form.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2360,height=1088,format=webp/_astro/gateway-create-with-ai.BYG07coh.png" alt="Create with AI button on the Gateway firewall policies page" loading="lazy" decoding="async" width="2360" height="1088"> <p>To create a policy with natural language, select <strong>Create with AI</strong> on any Gateway firewall policy tab. Choose a policy type, describe what the policy should do, and a fully configured rule will appear in the policy builder for review. You can edit any field before saving, or re-generate with a different prompt.</p> <p>The generated policy incorporates your account context - including lists, DLP profiles, applications, and device posture checks - so that references to your existing resources resolve automatically.</p> <p>A built-in feedback mechanism allows you to rate each generated policy and provide optional comments, which Cloudflare uses to improve output quality over time.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway firewall policies</a>.</p>Tue, 12 May 2026 00:00:00 GMTGatewayGatewayR2, R2 Data Catalog - R2 Data Catalog now exposes metrics via the GraphQL Analytics APIhttps://developers.cloudflare.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/https://developers.cloudflare.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> is a managed Apache Iceberg data catalog built directly into your R2 bucket that allows you to connect query engines like <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a>, Spark, Snowflake, and DuckDB to your data in R2.</p> <p>You can now query analytics for your R2 Data Catalog warehouses via Cloudflare's <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL Analytics API</a>. Two new datasets are available:</p> <ul> <li><strong><code>r2CatalogDataOperationsAdaptiveGroups</code></strong> tracks Iceberg REST API requests made to your catalog, including operation type, request duration, HTTP status, and request body bytes. Use this to monitor request volume and latency across warehouses, namespaces, and tables.</li> <li><strong><code>r2CatalogTableMaintenanceAdaptiveGroups</code></strong> tracks table maintenance jobs such as compaction and snapshot expiration. Use this to monitor job success rates, files processed, bytes read and written, and job duration.</li> </ul> <p>Both datasets support filtering by warehouse name, namespace, table name, and time range. They also include percentile aggregations for duration metrics.</p> <p>For detailed schema information and example queries, refer to the <a href="https://developers.cloudflare.com/r2-data-catalog/observability/metrics/">R2 Data Catalog metrics and analytics documentation</a>.</p>Tue, 12 May 2026 00:00:00 GMTR2R2R2 Data CatalogSecurity Center - Agent Readiness scores now available in URL Scanner via the Cloudflare Dashboardhttps://developers.cloudflare.com/changelog/post/2026-05-12-URL-scanner-report-agent-readiness/https://developers.cloudflare.com/changelog/post/2026-05-12-URL-scanner-report-agent-readiness/<p>We’ve added a new <strong>Agent Readiness</strong> tab to URL Scanner reports accessible via the Cloudflare dashboard. This feature evaluates your site against emerging AI standards and provides six specialized scores to help you optimize for the next generation of AI agents and automated discovery.</p> <p>The Internet is shifting from a human-read web to a machine-read web. AI agents now browse, interact with, and even perform transactions on websites. If a site isn't "agent-ready," these bots may consume excessive bandwidth, fail to find critical information, or be unable to navigate your services efficiently.</p> <p>This update provides material value by breaking down readiness into six actionable categories:</p> <ul> <li><strong>Basic Web Presence</strong></li> <li><strong>Discoverability</strong></li> <li><strong>Content Accessibility</strong></li> <li><strong>Bot Access Control</strong></li> <li><strong>Protocol Discovery</strong></li> <li><strong>Commerce</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="accessing-the-report">Accessing the report</h4><a class="anchor-link" href="#accessing-the-report"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can view these scores for any scanned URL directly in the dashboard or via our API.</p> <ul> <li><strong>Dashboard:</strong> Go to <strong>Protect &amp; Connect &gt; Application Security &gt; Investigate</strong>. After running a scan, select the <strong>Agent Readiness</strong> tab in the report.</li> <li><strong>API:</strong> Use the <a href="https://developers.cloudflare.com/radar/investigate/url-scanner/" target="_blank" rel="noopener">URL Scanner API<span class="external-link"> ↗</span></a> to programmatically retrieve these scores for your infrastructure.</li> </ul> <p>To learn more about the methodology behind these scores, refer to the <a href="https://blog.cloudflare.com/agent-readiness/" target="_blank" rel="noopener">blogpost<span class="external-link"> ↗</span></a>.</p>Tue, 12 May 2026 00:00:00 GMTSecurity CenterSecurity CenterCloudflare One Client - Cloudflare One Client for Windows (version 2026.4.1350.0)https://developers.cloudflare.com/changelog/post/2026-05-11-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-05-11-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for Windows! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration authentication for devices via the integrated WebView2 browser is unavailable in this version as a temporary measure. As a result, the client will utilize the default browser on the device to complete the authentication process.</li> <li>An error indicating that Microsoft Edge can&#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.</li> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> <li>Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.</li> <li>DNS resolution may be broken when the following conditions are all true:<ul> <li>The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while the client is connected.<br>To work around this issue, please reconnect the client by selecting &quot;disconnect&quot; and then &quot;connect&quot; in the client user interface.</li> </ul> </li> </ul> Mon, 11 May 2026 17:35:58 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for macOS (version 2026.4.1350.0)https://developers.cloudflare.com/changelog/post/2026-05-11-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-05-11-warp-macos-ga/<p>A new GA release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Additional Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> </ul> Mon, 11 May 2026 17:35:57 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Linux (version 2026.4.1350.0)https://developers.cloudflare.com/changelog/post/2026-05-11-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-05-11-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release introduces the new Cloudflare One Client UI for Linux! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:</p> <ul> <li>Right click context menu to access the most common client actions quickly</li> <li>Built-in captive portal login experience</li> </ul> <p><strong>Changes and improvements</strong></p> <ul> <li>Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.</li> <li>Official support for RHEL 9 has been added for Cloudflare Mesh nodes. To install the RHEL 9 package, the Extra Packages for Enterprise Linux (EPEL) repository must be active, as it contains dependencies required for the tray icon and captive portal webview.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Registration may hang at &quot;Checking your organization configuration&quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.</li> <li>Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via <code>warp-cli tunnel ip</code> and <code>warp-cli tunnel host</code>. UI support will be added in a future release.</li> </ul> Mon, 11 May 2026 15:17:54 GMTCloudflare One ClientCloudflare One ClientCloudflare WAN, Magic Transit - NAT-T support for IKE on UDP port 500https://developers.cloudflare.com/changelog/post/2026-05-11-nat-t-port-500/https://developers.cloudflare.com/changelog/post/2026-05-11-nat-t-port-500/<p>Cloudflare IPsec now supports the standard NAT traversal (NAT-T) flow, where IKE begins on UDP port <code>500</code> and switches to UDP port <code>4500</code> after NAT is detected.</p> <p>Previously, devices behind NAT had to be configured to initiate IKE on UDP port <code>4500</code> directly. Devices that started on UDP port <code>500</code> could not complete the IKE handshake when NAT was in the path. This required custom configuration on devices such as VeloCloud SD-WAN edges, Cisco IOS-XE routers, and Juniper SRX firewalls, and was not possible on every platform.</p> <p>What changed:</p> <ul> <li>Devices behind NAT can now initiate IKE on either UDP port <code>500</code> or UDP port <code>4500</code>.</li> <li>Devices that start IKE on UDP port <code>500</code> and switch to UDP port <code>4500</code> after NAT detection now complete the handshake successfully.</li> <li>No configuration change is required on Cloudflare. The change is available for all IPsec tunnels on Cloudflare WAN and Magic Transit.</li> </ul> <p>This change does not affect existing tunnels:</p> <ul> <li>Tunnels using UDP port <code>500</code> with no NAT detected continue to operate as before.</li> <li>Tunnels configured to start IKE on UDP port <code>4500</code> continue to operate as before.</li> <li>NAT detection logic is unchanged.</li> </ul> <p>For configuration details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/">GRE and IPsec tunnels</a>.</p>Mon, 11 May 2026 00:00:00 GMTCloudflare WANCloudflare WANMagic TransitWAF - WAF Release - 2026-05-11https://developers.cloudflare.com/changelog/post/2026-05-11-waf-release/https://developers.cloudflare.com/changelog/post/2026-05-11-waf-release/ <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <p><strong>Continuous Rule Improvements</strong></p> <p>We are continuously refining our managed rules to provide more resilient protection and deeper insights into attack patterns. To ensure an optimal security posture, we recommend consistently monitoring the Security Events dashboard and adjusting rule actions as these enhancements are deployed.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="23ac4a9e53f94467ba470c9468b3c389"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...68b3c389</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Remote Code Execution - Java Deserialization - Body - Beta</td><td>Block</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Remote Code Execution - Java Deserialization" (ID: <rule-id id="36b0532eb3c941449afed2d3744305c4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...744305c4</span></button></rule-id>).</p></td></tr></tbody></table>Mon, 11 May 2026 00:00:00 GMTWAFWAFWorkers AI - Planned model deprecations on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/https://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/<p>We are refreshing the Workers AI model catalog to make room for newer releases. Please update your apps to remove references to the models listed below before the deprecation date.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="recommended-replacements">Recommended replacements</h4><a class="anchor-link" href="#recommended-replacements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/"><code>@cf/zai-org/glm-4.7-flash</code></a> — fast multilingual model with multi-turn tool calling and coding capabilities.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/"><code>@cf/google/gemma-4-26b-a4b-it</code></a> — efficient open model with vision and tool calling.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/"><code>@cf/moonshotai/kimi-k2.6</code></a> — capable tool-calling and vision model for agentic workloads and coding.</li> </ul> <p>For pricing, refer to the <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">Workers AI pricing page</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="kimi-k25">Kimi K2.5</h4><a class="anchor-link" href="#kimi-k25"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We originally stated Kimi K2.5 would be deprecated on May 10, 2026, however we have extended the deprecation date to May 30, 2026. Requests will be automatically aliased to Kimi K2.6 on May 30, 2026, which has a higher price. Please review the <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/"><code>@cf/moonshotai/kimi-k2.6</code></a> pricing and model capabilities prior to May 30, 2026 to ensure that the model suits your needs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="models-deprecated-on-may-30-2026">Models deprecated on May 30, 2026</h4><a class="anchor-link" href="#models-deprecated-on-may-30-2026"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>@cf/moonshotai/kimi-k2.5</code> --&gt; <code>@cf/moonshotai/kimi-k2.6</code></li> <li><code>@hf/meta-llama/meta-llama-3-8b-instruct</code></li> <li><code>@cf/meta/llama-3-8b-instruct</code></li> <li><code>@cf/meta/llama-3-8b-instruct-awq</code></li> <li><code>@cf/meta/llama-3.1-8b-instruct</code></li> <li><code>@cf/meta/llama-3.1-8b-instruct-awq</code></li> <li><code>@cf/meta/llama-3.1-70b-instruct</code></li> <li><code>@cf/meta/llama-2-7b-chat-int8</code></li> <li><code>@cf/meta/llama-2-7b-chat-fp16</code></li> <li><code>@cf/mistral/mistral-7b-instruct-v0.1</code></li> <li><code>@hf/mistral/mistral-7b-instruct-v0.2</code></li> <li><code>@hf/google/gemma-7b-it</code></li> <li><code>@cf/google/gemma-3-12b-it</code></li> <li><code>@hf/nousresearch/hermes-2-pro-mistral-7b</code></li> <li><code>@cf/microsoft/phi-2</code></li> <li><code>@cf/defog/sqlcoder-7b-2</code></li> <li><code>@cf/unum/uform-gen2-qwen-500m</code></li> <li><code>@cf/facebook/bart-large-cnn</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="variants-that-remain-active">Variants that remain active</h4><a class="anchor-link" href="#variants-that-remain-active"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>-fast</code> and <code>-lora</code> variants of models will remain active, including:</p> <ul> <li><code>@cf/meta/llama-3.3-70b-instruct-fp8-fast</code></li> <li><code>@cf/meta/llama-3.1-8b-instruct-fast</code></li> <li><code>@cf/google/gemma-7b-it-lora</code></li> <li><code>@cf/google/gemma-2b-it-lora</code></li> <li><code>@cf/mistral/mistral-7b-instruct-v0.2-lora</code></li> <li><code>@cf/meta-llama/llama-2-7b-chat-hf-lora</code></li> </ul> <p>LoRA models may be deprecated in the future. We will be adding more LoRA capabilities to the catalog, and will communicate when new LoRA models come online to give users time to train new LoRAs before we deprecate old ones.</p> <p>For the full list of available models, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/">Workers AI model catalog</a>.</p>Fri, 08 May 2026 00:00:00 GMTWorkers AIWorkers AIWorkers, WAF - WAF and framework adapter mitigations for React and Next.js vulnerabilitieshttps://developers.cloudflare.com/changelog/post/2026-05-06-react-nextjs-vulnerabilities/https://developers.cloudflare.com/changelog/post/2026-05-06-react-nextjs-vulnerabilities/<p>Multiple security vulnerabilities were disclosed by the React team and Vercel affecting React Server Components and Next.js. These include denial of service, middleware and proxy bypass, server-side request forgery, cross-site scripting, and cache poisoning issues across a range of severity levels.</p> <p><strong>We strongly recommend updating your application and its dependencies immediately.</strong> Patched versions are available for React (<code>react-server-dom-webpack</code>, <code>react-server-dom-parcel</code>, and <code>react-server-dom-turbopack</code> <code>19.0.6</code>, <code>19.1.7</code>, and <code>19.2.6</code>) and Next.js (<code>15.5.16</code> and <code>16.2.5</code>).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="waf-protections">WAF protections</h4><a class="anchor-link" href="#waf-protections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare WAF rules deployed in response to prior React Server Component CVEs (<a href="https://github.com/facebook/react/security/advisories/GHSA-2m3v-v2m8-q956" target="_blank" rel="noopener"><code>CVE-2025-55184</code><span class="external-link"> ↗</span></a> and <a href="https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg" target="_blank" rel="noopener"><code>CVE-2026-23864</code><span class="external-link"> ↗</span></a>) already provide coverage for the newly disclosed denial-of-service vulnerabilities. These rules are enabled by default with a Block action for all customers using the Cloudflare Managed Ruleset, including Free plan customers using the Free Managed Ruleset.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Ruleset</th> <th>Rule description</th> <th>Rule ID</th> <th>Default action</th> </tr> </thead> <tbody> <tr> <td>Cloudflare Managed Ruleset</td> <td>React - DoS - <a href="https://github.com/facebook/react/security/advisories/GHSA-2m3v-v2m8-q956" target="_blank" rel="noopener"><code>CVE-2025-55184</code><span class="external-link"> ↗</span></a></td> <td><code>2694f1610c0b471393b21aef102ec699</code></td> <td>Block</td> </tr> <tr> <td>Cloudflare Managed Ruleset</td> <td>React - DoS - <a href="https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg" target="_blank" rel="noopener"><code>CVE-2026-23864</code><span class="external-link"> ↗</span></a></td> <td><code>aaede80b4d414dc89c443cea61680354</code></td> <td>Block</td> </tr> </tbody> </table></div> <p>The existing rules detect the underlying attack patterns generically. As a result, they apply to the new <a href="https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh" target="_blank" rel="noopener"><code>CVE-2026-23870</code><span class="external-link"> ↗</span></a> denial-of-service vulnerability in Server Components and the corresponding Next.js advisory <a href="https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj" target="_blank" rel="noopener"><code>GHSA-8h8q-6873-q5fj</code><span class="external-link"> ↗</span></a>.</p> <p>Cloudflare is investigating whether WAF rules can be safely and effectively deployed for three of the high-severity advisories: <a href="https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh" target="_blank" rel="noopener"><code>CVE-2026-23870</code><span class="external-link"> ↗</span></a> / <a href="https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj" target="_blank" rel="noopener"><code>GHSA-8h8q-6873-q5fj</code><span class="external-link"> ↗</span></a>, <a href="https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f" target="_blank" rel="noopener"><code>GHSA-267c-6grr-h53f</code><span class="external-link"> ↗</span></a>, and <a href="https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx" target="_blank" rel="noopener"><code>GHSA-mg66-mrh9-m8jx</code><span class="external-link"> ↗</span></a>. If it is possible to create a managed WAF rule that mitigates these CVEs and does not potentially break application behavior, Cloudflare will add additional managed WAF rules. These rules will be announced through the <a href="https://developers.cloudflare.com/waf/change-log/changelog/">WAF changelog</a>. Because these vulnerabilities were shared with Cloudflare with minimal advance notice, we are still investigating what WAF mitigations are possible.</p> <p>Several of the disclosed vulnerabilities are not possible to block in WAF. We strongly recommend updating your applications so they are not purely reliant on WAF mitigations.</p> <p>Customers on Pro, Business, or Enterprise plans should ensure that <a href="https://developers.cloudflare.com/waf/get-started/#1-deploy-the-cloudflare-managed-ruleset">Managed Rules are enabled</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nextjs-adapters">Next.js adapters</h4><a class="anchor-link" href="#nextjs-adapters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Vinext:</strong> <a href="https://github.com/cloudflare/vinext" target="_blank" rel="noopener">Vinext<span class="external-link"> ↗</span></a> is a Vite plugin that reimplements the Next.js API surface. Vinext's latest release is not vulnerable to any of the disclosed CVEs. Vinext's architecture differs from stock Next.js in ways that sidestep the affected code paths. For example, it does not implement the PPR resume protocol, does not expose Pages Router data-route endpoints, and strips internal headers such as <code>x-nextjs-data</code> at request boundaries. As an extra layer of defense, we added a React <code>19.2.6</code> or later requirement when running <code>vinext init</code> (<a href="https://github.com/cloudflare/vinext/pull/1118" target="_blank" rel="noopener">PR #1118<span class="external-link"> ↗</span></a>, <a href="https://github.com/cloudflare/vinext/pull/1112" target="_blank" rel="noopener">PR #1112<span class="external-link"> ↗</span></a>) to prevent accidentally running a vulnerable version of React with Vinext.</p> <p><strong>OpenNext on Cloudflare:</strong> OpenNext is an adapter that lets you deploy Next.js apps to the Cloudflare Workers platform. OpenNext itself is not directly vulnerable to the React denial-of-service CVE, but users must update the Next.js version in their application. The OpenNext team has updated the adapter to further harden against these vectors and released a new version of the Cloudflare adapter. Test fixtures and examples have been updated to use patched versions (<a href="https://github.com/opennextjs/opennextjs-cloudflare/pull/1255" target="_blank" rel="noopener">PR #1255<span class="external-link"> ↗</span></a>).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="summary-of-disclosed-vulnerabilities">Summary of disclosed vulnerabilities</h4><a class="anchor-link" href="#summary-of-disclosed-vulnerabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Advisory</th> <th>Severity</th> <th>Issue</th> <th>WAF status</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh" target="_blank" rel="noopener"><code>CVE-2026-23870</code><span class="external-link"> ↗</span></a> / <a href="https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj" target="_blank" rel="noopener"><code>GHSA-8h8q-6873-q5fj</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>Denial of service in Server Components</td> <td><strong>WAF rules in place:</strong> <code>2694f1610c0b471393b21aef102ec699</code>, <code>aaede80b4d414dc89c443cea61680354</code><br>Cloudflare is investigating additional managed WAF coverage</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f" target="_blank" rel="noopener"><code>GHSA-267c-6grr-h53f</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>Middleware bypass via segment-prefetch routes</td> <td>Cloudflare is investigating if this can be safely and effectively mitigated by a managed WAF rule</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx" target="_blank" rel="noopener"><code>GHSA-mg66-mrh9-m8jx</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>Denial of service via connection exhaustion in Cache Components</td> <td>Cloudflare is investigating if this can be safely and effectively mitigated by a managed WAF rule</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-492v-c6pp-mqqv" target="_blank" rel="noopener"><code>GHSA-492v-c6pp-mqqv</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>Middleware bypass via dynamic route parameter injection</td> <td>Not possible to safely enable a managed WAF rule without potentially breaking application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r" target="_blank" rel="noopener"><code>GHSA-c4j6-fc7j-m34r</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>SSRF via WebSocket upgrades</td> <td>Not possible to safely enable a managed WAF rule without potentially breaking application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-36qx-fr4f-26g5" target="_blank" rel="noopener"><code>GHSA-36qx-fr4f-26g5</code><span class="external-link"> ↗</span></a></td> <td>High</td> <td>Middleware bypass in Pages Router i18n</td> <td>Custom WAF rule possible; global managed rule could potentially break application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-ffhc-5mcf-pf4q" target="_blank" rel="noopener"><code>GHSA-ffhc-5mcf-pf4q</code><span class="external-link"> ↗</span></a></td> <td>Moderate</td> <td>XSS via CSP nonces</td> <td>Custom WAF rule possible; global managed rule could potentially break application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-gx5p-jg67-6x7h" target="_blank" rel="noopener"><code>GHSA-gx5p-jg67-6x7h</code><span class="external-link"> ↗</span></a></td> <td>Moderate</td> <td>XSS in <code>beforeInteractive</code> scripts</td> <td>Not possible to safely enable a managed WAF rule without potentially breaking application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-h64f-5h5j-jqjh" target="_blank" rel="noopener"><code>GHSA-h64f-5h5j-jqjh</code><span class="external-link"> ↗</span></a></td> <td>Moderate</td> <td>Denial of service in Image Optimization API</td> <td>Custom WAF rule possible; global managed rule could potentially break application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-wfc6-r584-vfw7" target="_blank" rel="noopener"><code>GHSA-wfc6-r584-vfw7</code><span class="external-link"> ↗</span></a></td> <td>Moderate</td> <td>Cache poisoning in RSC responses</td> <td>Custom WAF rule possible; global managed rule could potentially break application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-vfv6-92ff-j949" target="_blank" rel="noopener"><code>GHSA-vfv6-92ff-j949</code><span class="external-link"> ↗</span></a></td> <td>Low</td> <td>Cache poisoning via RSC cache-busting collisions</td> <td>Not possible to safely enable a managed WAF rule without potentially breaking application behavior</td> </tr> <tr> <td><a href="https://github.com/vercel/next.js/security/advisories/GHSA-3g8h-86w9-wvmq" target="_blank" rel="noopener"><code>GHSA-3g8h-86w9-wvmq</code><span class="external-link"> ↗</span></a></td> <td>Low</td> <td>Middleware redirect cache poisoning</td> <td>Custom WAF rule possible; global managed rule could potentially break application behavior</td> </tr> </tbody> </table></div>Thu, 07 May 2026 12:00:00 GMTWorkersWorkersWAFCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Custom DHCP options on Cloudflare One Appliancehttps://developers.cloudflare.com/changelog/post/2026-05-07-appliance-dhcp-options/https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-dhcp-options/<p>When the Cloudflare One Appliance is acting as the DHCP server for a LAN, you can now configure custom DHCP options on the leases it issues. This unlocks workflows such as PXE / iPXE boot, VoIP phone provisioning, and vendor-specific client configuration.</p> <p>Each option is defined by <code>option_number</code>, <code>value</code>, and one of four value types: <code>text</code>, <code>integer</code>, <code>hex</code>, or <code>ip</code>. Configurations are validated on the appliance before being applied — invalid configurations are rejected and the underlying error is returned to the API caller, so a bad option will not disrupt the live DHCP service.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/dhcp/dhcp-options/">DHCP server options</a>.</p>Thu, 07 May 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Source-based breakout and prioritization on Cloudflare One Appliancehttps://developers.cloudflare.com/changelog/post/2026-05-07-appliance-source-based-breakout/https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-source-based-breakout/<p>Breakout and traffic prioritization rules on the Cloudflare One Appliance can now match by <strong>source</strong> in addition to destination application. You can pin breakout or priority behavior to:</p> <ul> <li>A source LAN interface — VLANs attached to that LAN are included automatically.</li> <li>A source IP address, range, or CIDR block.</li> </ul> <p>This is the natural way to break out a guest VLAN to the local Internet, or to prioritize traffic from a specific subnet, without enumerating destination applications.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/application-based-policies/breakout-traffic/#breakout-by-source">Breakout traffic</a>.</p>Thu, 07 May 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Self-serve provisioning of Cloudflare One Virtual Appliance via APIhttps://developers.cloudflare.com/changelog/post/2026-05-07-virtual-appliance-self-serve-api/https://developers.cloudflare.com/changelog/post/2026-05-07-virtual-appliance-self-serve-api/<p>You can now create, rotate, and delete Cloudflare One Virtual Appliance instances and their license keys directly via the API and Terraform.</p> <ul> <li>Create a virtual appliance and receive a license key: <code>POST /accounts/{account_id}/magic/connectors</code> with <code>device.provision_license: true</code>.</li> <li>Rotate the license key for an existing virtual appliance: <code>PATCH /accounts/{account_id}/magic/connectors/{connector_id}</code> with <code>provision_license: true</code>. The previous key is immediately and irrevocably revoked.</li> <li>Delete a virtual appliance to release the associated licensed device.</li> </ul> <p>The license key is returned in the response only once, at create or rotate time. Copy and store it securely.</p> <p>For details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/">Configure a Cloudflare One Virtual Appliance</a>.</p>Thu, 07 May 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANSecurity Center - CSV export and adjustable page density for RFIshttps://developers.cloudflare.com/changelog/post/2026-05-07-CSV-export-for-RFIs/https://developers.cloudflare.com/changelog/post/2026-05-07-CSV-export-for-RFIs/<p>You can now export your Requests for Information (RFI) history to a <strong>CSV document</strong> and customize your dashboard view by choosing how many RFI records to load per page.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>These quality-of-life updates focus on data portability and dashboard performance, allowing power users to manage high volumes of requests more efficiently:</p> <ul> <li>The new <strong>CSV export</strong> allows you to move RFI data into external tools for custom reporting, internal auditing, or cross-referencing with other security projects without manual data entry</li> <li>With <strong>adjustable page density</strong>, you can now choose to load more records at once (10, 25 or 50) to scan through history faster</li> </ul> <p>Cloudforce One subscribers can find these new options in <a href="https://dash.cloudflare.com/?to=/:account/application-security/threat-intelligence/requests" target="_blank" rel="noopener">Cloudflare Dashboard &gt; Application Security &gt; Threat Intelligence &gt; Requests for Information<span class="external-link"> ↗</span></a>.</p>Thu, 07 May 2026 00:00:00 GMTSecurity CenterSecurity CenterStream - Introducing Stream Bindings for Workershttps://developers.cloudflare.com/changelog/post/2026-05-07-stream-workers-binding/https://developers.cloudflare.com/changelog/post/2026-05-07-stream-workers-binding/ <p>You can now interact with your Stream video library using new bindings for Workers! This allows customers to upload content to Stream, provision direct uploads, manage videos, and generate signed URLs from a Worker without making authenticated API calls. We're excited to bring Stream and Workers closer together to empower more programmatic pipelines, tighter integrations, and support generative AI and inference workloads.</p> <p>Use the Stream binding when you want to:</p> <ul> <li>Upload videos from URLs or create basic direct upload links for end users</li> <li>Generate signed playback tokens without managing signing keys</li> <li>Manage video metadata, captions, downloads, and watermarks</li> <li>Build video pipelines entirely within Workers</li> </ul> <p>To get started, add the Stream binding to your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "stream"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"STREAM"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">stream</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"STREAM"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p><strong>Generate a video with AI and upload directly to Stream</strong> or send a URL of a file you already have:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "google/veo-3.1"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"A dog walking next to a river"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> duration: </span><span class="nb-shiki-mdbnqw">"10s"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> aspect_ratio: </span><span class="nb-shiki-mdbnqw">"16:9"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> resolution: </span><span class="nb-shiki-mdbnqw">"1080p"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> generate_audio: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> gateway: { id: </span><span class="nb-shiki-mdbnqw">"experiments"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Veo will return a URL of the generated asset.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> videoUrl</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> aiResponse.result.video;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Alternative option: a video of the Austin Office mobile</span></span> <span class="line"><span class="nb-shiki-21nrsd">// const videoUrl = 'https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4';</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Upload to Stream by providing a URL</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> streamVideo</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">upload</span><span class="nb-shiki-140thh">(videoUrl);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// The streamVideo response will include the video ID, playback and manifest</span></span> <span class="line"><span class="nb-shiki-21nrsd">// URLs, and other information, just like the REST API.</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> 'google/veo-3.1'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">'A dog walking next to a river'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> duration: </span><span class="nb-shiki-mdbnqw">'10s'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> aspect_ratio: </span><span class="nb-shiki-mdbnqw">'16:9'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> resolution: </span><span class="nb-shiki-mdbnqw">'1080p'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> generate_audio: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> gateway: { id: </span><span class="nb-shiki-mdbnqw">'experiments'</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Veo will return a URL of the generated asset.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> videoUrl</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> aiResponse.result.video;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Alternative option: a video of the Austin Office mobile</span></span> <span class="line"><span class="nb-shiki-21nrsd">// const videoUrl = 'https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4';</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Upload to Stream by providing a URL</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> streamVideo</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">upload</span><span class="nb-shiki-140thh">(videoUrl);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// The streamVideo response will include the video ID, playback and manifest</span></span> <span class="line"><span class="nb-shiki-21nrsd">// URLs, and other information, just like the REST API.</span></span></code></pre></figure></div></div></div></div> <p><strong>Generate a signed URL without using a signing key</strong> or an API call:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> video_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "ce800be43a9772f4bb02f35b860fb516"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> token</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">generateToken</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Use the "token" in an iframe embed code, manifest URL, or thumbnail:</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> embedUrl</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> `https://customer-igynxd2rwhmuoxw8.cloudflarestream.com/${</span><span class="nb-shiki-140thh">token</span><span class="nb-shiki-mdbnqw">}/iframe`</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> video_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'ce800be43a9772f4bb02f35b860fb516'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> token</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">generateToken</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Use the "token" in an iframe embed code, manifest URL, or thumbnail:</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> embedUrl</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> `https://customer-igynxd2rwhmuoxw8.cloudflarestream.com/${</span><span class="nb-shiki-140thh">token</span><span class="nb-shiki-mdbnqw">}/iframe`</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div></div></div></div> <p><strong>Get and set video properties</strong> easily:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> video_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "46c8b7f480d410840758c1cb14a72e47"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">details</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">update</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> meta: { name: </span><span class="nb-shiki-mdbnqw">"sample video"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> video_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> '46c8b7f480d410840758c1cb14a72e47'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">details</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">STREAM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">video</span><span class="nb-shiki-140thh">(video_id).</span><span class="nb-shiki-1t8gfj">update</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> meta: { name: </span><span class="nb-shiki-mdbnqw">'sample video'</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>For setup instructions and the full API reference, refer to <a href="https://developers.cloudflare.com/stream/manage-video-library/bindings/">Bind to Workers API</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started-with-your-agent">Get started with your Agent</h4><a class="anchor-link" href="#get-started-with-your-agent"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <blockquote> <p>Add a binding for Cloudflare Stream (env.STREAM). On the watch page, use the Stream binding to get info based on the ID, and leverage video.meta.name as the page title.</p> </blockquote>Thu, 07 May 2026 00:00:00 GMTStreamStreamWAF - WAF Release - 2026-05-07 - Emergencyhttps://developers.cloudflare.com/changelog/post/2026-05-07-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2026-05-07-emergency-waf-release/ <p>This emergency release introduces a new rule to detect Next.js App Router middleware and proxy bypass attempts via segment-prefetch routes (CVE-2026-44575).</p> <p><strong>Key Findings</strong></p> <p>CVE-2026-44575: Next.js Middleware / Proxy Bypass in App Router Applications via Segment-Prefetch Routes</p> <p>Successful exploitation allows unauthenticated attackers to bypass middleware or proxy-based authorization checks in affected Next.js App Router applications. This leads to unauthorized access to protected content, potential exposure of sensitive application data, and compromise of application security boundaries.</p> <p>We strongly recommend upgrading to Next.js 15.5.16 or 16.2.5 (or later) immediately to address the underlying vulnerability. If you cannot upgrade immediately, enforce authorization in the underlying route or page logic instead of relying solely on middleware.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1de95bf6d6374e1099854278e77e4a53"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e77e4a53</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Next.js - Middleware Bypass via Invalid RSC Header - CVE:CVE-2026-44575</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr></tbody></table>Thu, 07 May 2026 00:00:00 GMTWAFWAFWorkers - Automatic tracing across Durable Object and Worker subrequestshttps://developers.cloudflare.com/changelog/post/2026-05-07-automatic-tracing-across-do-and-worker-subrequests/https://developers.cloudflare.com/changelog/post/2026-05-07-automatic-tracing-across-do-and-worker-subrequests/<p>You can now get a single unified trace across Worker-to-Worker subrequests, with trace context propagating automatically. Previously, <a href="https://developers.cloudflare.com/workers/observability/traces/">automatic tracing</a> produced disconnected traces when a Worker called another Worker through a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/">service binding</a> or <a href="https://developers.cloudflare.com/durable-objects/">Durable Object</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1824,height=1156,format=webp/_astro/2026-04-28-worker-to-worker-context-prop.Db1qNQJL.png" alt="Unified trace showing nested spans across a Durable Object subrequest and a service binding call" loading="lazy" decoding="async" width="1824" height="1156"> <p>This means you can:</p> <ul> <li>Follow a request through your entire Worker architecture in one trace view</li> <li>See service binding and Durable Object calls as nested child spans instead of separate traces</li> <li>Debug cross-Worker request flows in the Cloudflare dashboard or in an external observability platform via <a href="https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/">OpenTelemetry</a></li> </ul> <p><a href="https://developers.cloudflare.com/workers/observability/traces/#how-to-enable-tracing">Tracing must be enabled</a> in your Wrangler configuration for traces to be recorded. Checkout <a href="https://developers.cloudflare.com/workers/observability/traces/">Workers tracing</a> to get started.</p> <p>Up next, we are working on external trace context propagation using <a href="https://www.w3.org/TR/trace-context/" target="_blank" rel="noopener">W3C Trace Context standards<span class="external-link"> ↗</span></a>, which will allow traces from your Workers to link with traces from services outside of Cloudflare.</p>Thu, 07 May 2026 00:00:00 GMTWorkersWorkersEmail security - Cloudy Summaries in PhishNet O365https://developers.cloudflare.com/changelog/post/2026-05-06-cloudy-summaries-in-phishnet_o365/https://developers.cloudflare.com/changelog/post/2026-05-06-cloudy-summaries-in-phishnet_o365/<p>PhishNet users can now access <strong>Cloudy summaries</strong> directly within the email investigation experience. When reviewing a message in PhishNet, users will see an AI-generated summary that provides additional context and key details about the email.</p> <p>These summaries help users quickly understand the nature of a message without needing to manually parse through headers, body content, and detection signals. Cloudy surfaces the most relevant information so users can make faster, more informed decisions about suspicious emails.</p> <p><strong>These summaries are not trained on customer data.</strong> They are generated using the outputs of our existing detection models and analysis systems.</p> <p>This feature is available for PhishNet with Office 365. Support for Gmail will be available by the end of the quarter.</p>Wed, 06 May 2026 18:15:13 GMTEmail securityEmail securityCloudflare One - IPv6 CIDR routes for Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-05-06-mesh-ipv6-routes/https://developers.cloudflare.com/changelog/post/2026-05-06-mesh-ipv6-routes/<p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> nodes now support IPv6 CIDR routes. You can advertise both IPv4 and IPv6 subnets through your Mesh nodes, making IPv6-only or dual-stack private networks reachable from any enrolled device.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2906,height=1352,format=webp/_astro/mesh-ipv6-routes.CC-jlZkw.png" alt="IPv6 CIDR routes on a Mesh node in the Cloudflare dashboard" loading="lazy" decoding="async" width="2906" height="1352"> <p>To add an IPv6 route, follow the same steps as <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#add-a-route">adding an IPv4 route</a> — enter the IPv6 CIDR (for example, <code>fd00::/64</code>) when configuring the route in the <a href="https://dash.cloudflare.com/?to=/:account/mesh" target="_blank" rel="noopener">dashboard<span class="external-link"> ↗</span></a> or via the API.</p>Wed, 06 May 2026 00:00:00 GMTCloudflare OneCloudflare OneRadar - TLD Nameserver Performance in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-05-06-radar-tld-nameserver-performance/https://developers.cloudflare.com/changelog/post/2026-05-06-radar-tld-nameserver-performance/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now provides TLD authoritative nameserver performance insights, measuring response time (latency) as observed from Cloudflare's <a href="https://developers.cloudflare.com/1.1.1.1/">1.1.1.1</a> resolver infrastructure when forwarding queries upstream to TLD nameservers.</p> <p>New widgets on <a href="https://radar.cloudflare.com/tlds/com" target="_blank" rel="noopener">TLD detail pages<span class="external-link"> ↗</span></a>:</p> <ul> <li><a href="https://radar.cloudflare.com/tlds/com#tld-ns-latency" target="_blank" rel="noopener"><strong>Aggregate nameserver latency</strong><span class="external-link"> ↗</span></a>: Response time percentiles (p25/p50/p75) for all authoritative nameservers of the selected TLD.</li> <li><a href="https://radar.cloudflare.com/tlds/com#tld-ns-latency-by-ns" target="_blank" rel="noopener"><strong>Latency per nameserver</strong><span class="external-link"> ↗</span></a>: Median response time (p50) broken down by each authoritative nameserver over time.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1268,format=webp/_astro/tld-nameserver-latency-by-ns.CZGT23Vk.png" alt="Latency per nameserver chart" loading="lazy" decoding="async" width="1600" height="1268"> <ul> <li><a href="https://radar.cloudflare.com/tlds/com#geographical-distribution" target="_blank" rel="noopener"><strong>Median latency geographic distribution</strong><span class="external-link"> ↗</span></a>: p50 response time by Cloudflare data center country, displayed on a choropleth map.</li> <li><a href="https://radar.cloudflare.com/tlds/com#tld-ranking" target="_blank" rel="noopener"><strong>TLD ranking over time</strong><span class="external-link"> ↗</span></a>: Daily DNS magnitude rank and magnitude value with a Rank/Magnitude toggle.</li> <li><a href="https://radar.cloudflare.com/tlds" target="_blank" rel="noopener"><strong>Rank change deltas</strong><span class="external-link"> ↗</span></a>: 1 week, 4 weeks, and 3 months rank changes added to the TLD magnitude table and the TLD detail info panel.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2642,height=1446,format=webp/_astro/tld-magnitude-rank-deltas.BaT-jII_.webp" alt="TLD Rankings by DNS Magnitude table with rank change deltas" loading="lazy" decoding="async" width="2642" height="1446"> <p>The new <a href="https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/"><code>TLD Performance</code></a> API provides the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/methods/summary/"><code>/tlds/performance/summary/{dimension}</code></a> — TLD nameserver performance summarized by dimension.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/methods/timeseries_groups/"><code>/tlds/performance/timeseries_groups/{dimension}</code></a> — TLD nameserver performance over time grouped by dimension.</li> </ul> <p>Available dimensions: <code>LATENCY</code> (aggregate p25/p50/p75), <code>NAMESERVER_LATENCY</code> (per-nameserver p50), <code>LOCATION_LATENCY</code> (per-data-center-country p50).</p> <p>TLD Performance is also available as a dataset in the <a href="https://radar.cloudflare.com/explorer?dataSet=tlds.performance" target="_blank" rel="noopener">Data Explorer<span class="external-link"> ↗</span></a>.</p> <p>Check out the updated <a href="https://radar.cloudflare.com/tlds/com" target="_blank" rel="noopener">TLD detail page<span class="external-link"> ↗</span></a>.</p>Wed, 06 May 2026 00:00:00 GMTRadarRadarSecurity Center - TAXII support added to Threat Events APIhttps://developers.cloudflare.com/changelog/post/2026-05-06-TAXII-support-for-threat-events-api/https://developers.cloudflare.com/changelog/post/2026-05-06-TAXII-support-for-threat-events-api/<p>The Cloudforce One Threat Events API now supports <a href="https://www.cloudflare.com/en-gb/learning/security/what-is-stix-and-taxii/" target="_blank" rel="noopener"><strong>TAXII</strong><span class="external-link"> ↗</span></a> as an output format, enabling standardized, automated sharing of cyber threat intelligence with your existing security stack.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>You can now ingest Cloudforce One threat data directly into your SIEM, TIP or SOAR tools that prefer TAXII-formatted streams without needing custom translation scripts.</li> <li>By supporting the TAXII format parameter in our API, security teams can automate the synchronization of indicator data, reducing the manual overhead of updating blocklists and detection rules.</li> <li>This alignment with industry standards ensures that your threat data remains consistent across different security ecosystems and partner integrations.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-use-it">How to use it</h4><a class="anchor-link" href="#how-to-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When calling the Threat Events API, you can now specify <code>taxii</code> in the <code>format</code> query parameter:</p> <p><code>GET /accounts/{account_id}/cloudforce_one/threat_events?format=taxii</code></p> <p>You can find the updated documentation in the <a href="https://developers.cloudflare.com/api/resources/cloudforce_one/subresources/threat_events/methods/list#%28resource%29%20cloudforce_one.threat_events%20%3E%20%28method%29%20list%20%3E%20%28params%29%20default%20%3E%20%28param%29%20format%20%3E%20%28schema%29" target="_blank" rel="noopener">Cloudflare API Reference<span class="external-link"> ↗</span></a>.</p>Wed, 06 May 2026 00:00:00 GMTSecurity CenterSecurity CenterCache - Pingora now powers Cloudflare's cachehttps://developers.cloudflare.com/changelog/post/2026-05-04-pingora-powers-cache/https://developers.cloudflare.com/changelog/post/2026-05-04-pingora-powers-cache/<p>Cloudflare's cache now runs on a new proxy built on <a href="https://github.com/cloudflare/pingora" target="_blank" rel="noopener">Pingora<span class="external-link"> ↗</span></a>, the Rust-based framework that already serves a significant portion of Cloudflare's network traffic. The new proxy is faster, more memory-safe, and designed to evolve our cache architecture. It delivers immediate performance improvements and enables new caching capabilities.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-this-brings">What this brings</h4><a class="anchor-link" href="#what-this-brings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Lower latency</strong>: The new proxy reduces per-request overhead through improved connection reuse.</li> <li><strong>Reduced cache MISSes</strong>: Enhanced cache retention improves origin offload.</li> <li><strong>Better RFC compliance</strong>: Caching behavior more closely follows HTTP caching standards.</li> <li><strong>Foundation for future features</strong>: The new architecture enables upcoming improvements to cache functionality and efficiency.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-features">New features</h4><a class="anchor-link" href="#new-features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Asynchronous <code>stale-while-revalidate</code></strong>: Every request returns stale content immediately while revalidation happens in the background, instead of the first request after expiry blocking on the origin. Refer to the <a href="https://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/">asynchronous <code>stale-while-revalidate</code> changelog</a> for details.</li> <li><strong>Unbuffered bypass by default</strong>: Responses that bypass cache are streamed directly to the client without buffering, reducing time-to-first-byte for uncacheable content.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="behavioral-changes">Behavioral changes</h4><a class="anchor-link" href="#behavioral-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new architecture introduces the following behavioral changes to improve RFC compliance and correctness:</p> <ul> <li><strong><code>Vary: *</code> results in cache bypass</strong>: According to <a href="https://httpwg.org/specs/rfc9110.html#field.vary" target="_blank" rel="noopener">RFC 9110 Section 12.5.5<span class="external-link"> ↗</span></a>, a <code>Vary</code> header value of <code>*</code> indicates the response varies on factors beyond request headers and must not be served from cache. Cloudflare now bypasses cache for these responses instead of storing them.</li> <li><strong><code>Set-Cookie</code> stripped on MISS and EXPIRED</strong>: For cacheable assets, <code>Set-Cookie</code> is now stripped on MISS and EXPIRED responses, not only on HITs.</li> <li><strong>Floating-point TTL values</strong>: Floating-point time-to-live values (for example, <code>max-age=1.5</code>) are rounded down to the nearest integer instead of being rejected as invalid.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-next">What's next</h4><a class="anchor-link" href="#whats-next"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A deeper look at the new cache proxy is coming soon to the <a href="https://blog.cloudflare.com/" target="_blank" rel="noopener">Cloudflare blog<span class="external-link"> ↗</span></a>. For background on the underlying framework, read:</p> <ul> <li><a href="https://blog.cloudflare.com/pingora-open-source/" target="_blank" rel="noopener">Open sourcing Pingora: our Rust framework for building programmable network services<span class="external-link"> ↗</span></a></li> <li><a href="https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/" target="_blank" rel="noopener">How we built Pingora, the proxy that connects Cloudflare to the Internet<span class="external-link"> ↗</span></a></li> </ul>Mon, 04 May 2026 00:00:00 GMTCacheCacheCloudflare Fundamentals - Keyboard shortcuts for the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-05-04-keyboard-shortcuts/https://developers.cloudflare.com/changelog/post/2026-05-04-keyboard-shortcuts/<p>You can now navigate, switch context, and take common actions in the Cloudflare dashboard without leaving your keyboard. Press <code>?</code> anywhere to see the full list. Keyboard shortcuts can be disabled by visiting your <a href="https://dash.cloudflare.com/profile/settings" target="_blank" rel="noopener">profile settings<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="navigate">Navigate</h4><a class="anchor-link" href="#navigate"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Shortcut</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td><code>g h</code></td> <td>Go to Home</td> </tr> <tr> <td><code>g a</code></td> <td>Go to account overview</td> </tr> <tr> <td><code>g z</code></td> <td>Go to zone overview</td> </tr> <tr> <td><code>g p</code></td> <td>Go to your profile</td> </tr> <tr> <td><code>g w</code></td> <td>Go to Workers &amp; Pages</td> </tr> <tr> <td><code>g o</code></td> <td>Go to Zero Trust</td> </tr> <tr> <td><code>g b</code></td> <td>Go to billing</td> </tr> <tr> <td><code>g 1</code> – <code>g 5</code></td> <td>Go to a recent or pinned item (by position in sidebar)</td> </tr> <tr> <td><code>t →</code></td> <td>Move to the next tab</td> </tr> <tr> <td><code>t ←</code></td> <td>Move to the previous tab</td> </tr> <tr> <td><code>p →</code></td> <td>Move to the next page of a table</td> </tr> <tr> <td><code>p ←</code></td> <td>Move to the previous page of a table</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="take-action">Take action</h4><a class="anchor-link" href="#take-action"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Shortcut</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td><code>/</code></td> <td>Open quick search</td> </tr> <tr> <td><code>?</code></td> <td>Show keyboard shortcuts</td> </tr> <tr> <td><code>s a</code></td> <td>Switch account</td> </tr> <tr> <td><code>s z</code></td> <td>Switch zone</td> </tr> <tr> <td><code>s .</code></td> <td>Star or unstar the current zone</td> </tr> <tr> <td><code>p .</code></td> <td>Pin or unpin the current page</td> </tr> <tr> <td><code>t s</code></td> <td>Toggle the sidebar open or closed</td> </tr> <tr> <td><code>t m</code></td> <td>Expand or collapse all sidebar menus</td> </tr> <tr> <td><code>t a</code></td> <td>Toggle Ask AI sidebar</td> </tr> <tr> <td><code>d .</code></td> <td>Toggle dark mode</td> </tr> <tr> <td><code>c u</code></td> <td>Copy the current URL</td> </tr> <tr> <td><code>c d</code></td> <td>Copy a deep link URL</td> </tr> </tbody> </table></div>Mon, 04 May 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsPipelines - Pipelines and R2 Data Catalog now supported in Terraformhttps://developers.cloudflare.com/changelog/post/2026-04-27-terraform-support/https://developers.cloudflare.com/changelog/post/2026-04-27-terraform-support/<p><a href="https://developers.cloudflare.com/pipelines/">Cloudflare Pipelines</a> ingests streaming data via <a href="https://developers.cloudflare.com/workers/">Workers</a> or HTTP endpoints, transforms it with SQL, and writes it to <a href="https://developers.cloudflare.com/r2/">R2</a> as Apache Iceberg tables. <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> manages those Iceberg tables, compaction, and compatibility with query engines like <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a>, <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/spark-scala/">Spark</a>, and <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/">DuckDB</a>.</p> <p>You can now create and manage both products using Terraform, supported in the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Cloudflare Terraform provider v5.19.0<span class="external-link"> ↗</span></a>.</p> <p>This adds four new resources that let you define your entire data pipeline as infrastructure-as-code: a data catalog, a stream for ingestion, a sink that writes to R2 Data Catalog or R2, and a pipeline that connects them with SQL.</p> <p>The new Terraform resources are:</p> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/r2_data_catalog" target="_blank" rel="noopener"><code>cloudflare_r2_data_catalog</code><span class="external-link"> ↗</span></a> — enable the data catalog on an R2 bucket</li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline_stream" target="_blank" rel="noopener"><code>cloudflare_pipeline_stream</code><span class="external-link"> ↗</span></a> — create a stream that receives events via HTTP or Worker bindings</li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline_sink" target="_blank" rel="noopener"><code>cloudflare_pipeline_sink</code><span class="external-link"> ↗</span></a> — create a sink that writes to R2 Data Catalog or R2</li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline" target="_blank" rel="noopener"><code>cloudflare_pipeline</code><span class="external-link"> ↗</span></a> — create a pipeline with SQL connecting a stream to a sink</li> </ul> <p>Here is a minimal example that creates a stream, an R2 Data Catalog sink, and a pipeline:</p> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_pipeline_stream"</span><span class="nb-shiki-dzsirb"> "my_stream"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_stream"</span></span> <span class="line"><span class="nb-shiki-140thh"> format</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { type </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "json"</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> schema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> fields </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> name </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "value"</span></span> <span class="line"><span class="nb-shiki-140thh"> type </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "json"</span></span> <span class="line"><span class="nb-shiki-140thh"> required </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> true</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> http</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { enabled </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-140thh">, authentication </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">, cors </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {} }</span></span> <span class="line"><span class="nb-shiki-140thh"> worker_binding</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { enabled </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_pipeline_sink"</span><span class="nb-shiki-dzsirb"> "my_sink"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_sink"</span></span> <span class="line"><span class="nb-shiki-140thh"> type</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "r2_data_catalog"</span></span> <span class="line"><span class="nb-shiki-140thh"> format</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { type </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "parquet"</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> schema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { fields </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> [] }</span></span> <span class="line"><span class="nb-shiki-140thh"> config</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> var.cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> bucket </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "my-pipeline-bucket"</span></span> <span class="line"><span class="nb-shiki-140thh"> table_name </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "my_table"</span></span> <span class="line"><span class="nb-shiki-140thh"> token </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> var.catalog_token</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_pipeline"</span><span class="nb-shiki-dzsirb"> "my_pipeline"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_pipeline"</span></span> <span class="line"><span class="nb-shiki-140thh"> sql</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "INSERT INTO </span><span class="nb-shiki-1itgoe">${</span><span class="nb-shiki-140thh">cloudflare_pipeline_sink</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">my_sink</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-1itgoe">}</span><span class="nb-shiki-mdbnqw"> SELECT * FROM </span><span class="nb-shiki-1itgoe">${</span><span class="nb-shiki-140thh">cloudflare_pipeline_stream</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">my_stream</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-1itgoe">}</span><span class="nb-shiki-mdbnqw">"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For a full end-to-end example that includes R2 bucket creation, data catalog setup, and scoped API token provisioning, refer to the <a href="https://developers.cloudflare.com/pipelines/reference/terraform/">Pipelines Terraform documentation</a>.</p>Mon, 04 May 2026 00:00:00 GMTPipelinesPipelinesRadar - New routing widgets on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-05-04-radar-routing-widgets/https://developers.cloudflare.com/changelog/post/2026-05-04-radar-routing-widgets/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> is expanding its <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Routing section<span class="external-link"> ↗</span></a> with two new widgets that give a deeper view into how networks announce address space and how RPKI ROA coverage evolves over time.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="top-ases-by-announced-ip-space-on-country-pages">Top ASes by announced IP space on country pages</h4><a class="anchor-link" href="#top-ases-by-announced-ip-space-on-country-pages"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Country routing pages now include a <strong>Top ASes by announced IP space</strong> chart, breaking down the IPv4 and IPv6 address space announced from a country across the autonomous systems that originate it. The chart stacks the IPv4 and IPv6 views vertically, with the top contributing ASes called out by color and the remaining networks aggregated as <strong>Other</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1322,format=webp/_astro/country-top-ases-ip-space.CoGqJB6W.png" alt="Screenshot of the top ASes by announced IP space chart on a country routing page" loading="lazy" decoding="async" width="1600" height="1322"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rpki-roa-deployment-timeseries">RPKI ROA deployment timeseries</h4><a class="anchor-link" href="#rpki-roa-deployment-timeseries"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://radar.cloudflare.com/routing/rpki" target="_blank" rel="noopener">RPKI sub-page<span class="external-link"> ↗</span></a> adds an <strong>RPKI ROA deployment</strong> timeseries widget that tracks the share of announced BGP space covered by a valid Route Origin Authorization (ROA) over time, with separate IPv4 and IPv6 lines. A toggle switches the view between the share of covered <strong>prefixes</strong> and the share of covered <strong>IP address space</strong>. The widget is available on global, country, and AS views, so operators can monitor RPKI adoption progress and compare deployment trends across different scopes.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=874,format=webp/_astro/rpki-roa-deployment-timeseries.DTsP_V93.png" alt="Screenshot of the RPKI ROA deployment timeseries widget" loading="lazy" decoding="async" width="1600" height="874"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-endpoints">API endpoints</h4><a class="anchor-link" href="#api-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The data behind these widgets is also available through two new endpoints on the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/"><code>BGP</code></a> API:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/ips/subresources/top/methods/ases/"><code>/bgp/ips/top/ases</code></a> - Returns the top autonomous systems by announced IP space (IPv4 <code>/24</code>s or IPv6 <code>/48</code>s), globally or filtered by country, snapped to the nearest 8-hour RIB boundary.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/roas/methods/timeseries/"><code>/bgp/rpki/roas/timeseries</code></a> - Returns RPKI ROA validation coverage over time, by share of prefixes or share of IP address space, split by IP version, with optional ASN or location filters.</li> </ul> <p>Visit the <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Radar routing section<span class="external-link"> ↗</span></a> to explore both widgets.</p>Mon, 04 May 2026 00:00:00 GMTRadarRadarWAF - WAF Release - 2026-05-04https://developers.cloudflare.com/changelog/post/2026-05-04-waf-release/https://developers.cloudflare.com/changelog/post/2026-05-04-waf-release/ <p>This week's release focuses on new detections to expand coverage across command injection, SQL injection, PHP object injection, remote code execution, and XSS attack vectors.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <p><strong>Continuous Rule Improvements</strong></p> <p>We are continuously refining our managed rules to provide more resilient protection and deeper insights into attack patterns. To ensure an optimal security posture, we recommend consistently monitoring the Security Events dashboard and adjusting rule actions as these enhancements are deployed.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="607ec27233b54beb8b89386ef0884a68"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f0884a68</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>XSS, HTML Injection - Object Tag - Body (beta)</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "XSS, HTML Injection - Object Tag" (ID: <rule-id id="e9e3ac45a6d842f1a132fbf70c14e284"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0c14e284</span></button></rule-id>).</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0087c27420c54168a10bc05eff012303"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ff012303</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Object Tag - Headers</td><td>Log</td><td>Block</td><td><p>This is a new detection. The rule previously known as "XSS, HTML Injection - Object Tag - Headers (beta)" is now renamed to "XSS, HTML Injection - Object Tag - Headers".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="38dc97853ebf40ed9476ec7816f921d9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...16f921d9</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Object Tag - URI</td><td>Log</td><td>Block</td><td><p>This is a new detection. The rule previously known as "XSS, HTML Injection - Object Tag - URI (beta)" is now renamed to "XSS, HTML Injection - Object Tag - URI".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="963cb530f72d4c75b2ae7befdc90d21a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dc90d21a</span></button></rule-id></td><td>N/A</td><td>Command Injection - Generic 9 - Body Vector - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Command Injection - Generic 9 - Body Vector" (ID: <rule-id id="155bb67d1061479e995a38510677175f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0677175f</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6ac1b6dfe22449a798cc7021f8960375"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f8960375</span></button></rule-id></td><td>N/A</td><td>Command Injection - Generic 9 - Header Vector - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Command Injection - Generic 9 - Header Vector" (ID: <rule-id id="b31c34a7b29b4aaf9be6883d1eb7a999"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1eb7a999</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="47a9b66dd73a4a558590c4bdef47a800"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ef47a800</span></button></rule-id></td><td>N/A</td><td>Command Injection - Generic 9 - URI Vector - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Command Injection - Generic 9 - URI Vector" (ID: <rule-id id="54ad0465c30d4cd2ac7a707197321c6c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...97321c6c</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d2ae4a8093f245a1b9de71bbbeebf804"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...beebf804</span></button></rule-id></td><td>N/A</td><td>Command Injection - Sleep - Body</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. The rule previously known as "Command Injection</p><ul> <li>Sleep" is now renamed to "Command Injection - Sleep - Body".</li> </ul></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="da91868c0d3d44afb846e7830d257566"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d257566</span></button></rule-id></td><td>N/A</td><td>Command Injection - Sleep - Headers</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="04863c61e982464b91778f051856fe86"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1856fe86</span></button></rule-id></td><td>N/A</td><td>Command Injection - Sleep - URI</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9dc1a0b8dbb7425db619309be6e43c37"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e6e43c37</span></button></rule-id></td><td>N/A</td><td>Fortinet FortiSandbox - Command Injection - CVE:CVE-2026-39808</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b84c10f5a8f84800905932dc88118795"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...88118795</span></button></rule-id></td><td>N/A</td><td>Remote Code Execution - Common Bash Bypass - Headers</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f496c40011f14bfdb5f55ec79299d53b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9299d53b</span></button></rule-id></td><td>N/A</td><td>Remote Code Execution - Common Bash Bypass - URI</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a5f75abac2664554a984d061b0bf33f9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b0bf33f9</span></button></rule-id></td><td>N/A</td><td>Remote Code Execution - Common Bash Bypass - Body - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Remote Code Execution - Common Bash Bypass Body" (ID: <rule-id id="6e2f7a696ea74c979e7d069cefb7e5b9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...efb7e5b9</span></button></rule-id>). The rule previously known as "Remote Code Execution - Common Bash Bypass Beta" is now renamed to "Remote Code Execution - Common Bash Bypass Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bbb31a886ab54f6c8cdd220d33bfe8b9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...33bfe8b9</span></button></rule-id></td><td>N/A</td><td>PHP Object Injection - 2 - Body - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "PHP Object Injection - 2" (ID: <rule-id id="8ef3c3f91eef46919cc9cb6d161aafdc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...161aafdc</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e199688ab69746c88c33457f29552387"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...29552387</span></button></rule-id></td><td>N/A</td><td>PHP Object Injection - 2 - Headers</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="eb33d40e96c54e929af6ed9c8104f4c5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8104f4c5</span></button></rule-id></td><td>N/A</td><td>PHP Object Injection - 2 - URI</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="76b15b7b122a4be6a40d8aa96a46201e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6a46201e</span></button></rule-id></td><td>N/A</td><td>SQLi - DROP - 2 - Beta</td><td>N/A</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - DROP - 2" (ID: <rule-id id="a967a167874b42b6898be46e48ac2221"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...48ac2221</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e24b2ef4a5c54f97a62db7a68b7f85ee"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8b7f85ee</span></button></rule-id></td><td>N/A</td><td>SQLi - DROP - 2 - Headers</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="51123f35f1d249358aea8fb11546b5f0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1546b5f0</span></button></rule-id></td><td>N/A</td><td>SQLi - DROP - 2 - URI</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d86d8873310d41f2877458a91e053dce"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1e053dce</span></button></rule-id></td><td>N/A</td><td>SmarterMail - Remote Code Execution - CVE:CVE-2026-24423</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="00da180570d34b5bae2121acd0023a36"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d0023a36</span></button></rule-id></td><td>N/A</td><td>SQLi - SELECT Expression - Body</td><td>Block</td><td>Disabled</td><td>Action changed</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c46d9097c9ef419aa4d9f10626cc211f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...26cc211f</span></button></rule-id></td><td>N/A</td><td>SQLi - String Concatenation - URI</td><td>Block</td><td>Disabled</td><td>Action changed</td></tr></tbody></table>Mon, 04 May 2026 00:00:00 GMTWAFWAFWorkflows, Workers - Run Workflows inside Dynamic Workers with the @cloudflare/dynamic-workflows libraryhttps://developers.cloudflare.com/changelog/post/2026-05-01-dynamic-workflows/https://developers.cloudflare.com/changelog/post/2026-05-01-dynamic-workflows/<p>You can now use <a href="https://github.com/cloudflare/dynamic-workflows" target="_blank" rel="noopener"><code>@cloudflare/dynamic-workflows</code><span class="external-link"> ↗</span></a> to run a <a href="https://developers.cloudflare.com/workflows/">Workflow</a> inside a <a href="https://developers.cloudflare.com/dynamic-workers/">Dynamic Worker</a>, ensuring durable execution for code that is loaded at runtime.</p> <p>The Worker Loader loads Dynamic Workers on demand, which previously made durability challenging. Even within a Dynamic Worker, a Workflow might sleep for hours or days between steps, and by the time it resumes, the original Dynamic Worker code would no longer be in memory.</p> <p>The library solves this by tagging each Workflow instance with metadata that identifies which Dynamic Worker to load — for example, a tenant ID — then reloading the matching Dynamic Worker through the Worker Loader whenever a Workflow awakens.</p> <p>Because Dynamic Workers are created on-demand, you do not have to register each Workflow up front or manage them individually. Load the Workflow code in the Dynamic Worker when it is needed, and the Workflows engine handles persistence and retries behind the scenes. Your Workflow code itself is unaffected by the routing and behaves as normal.</p> <p>This unlocks patterns where the Workflow code itself is dynamic. For example, this is useful with:</p> <ul> <li><strong>SaaS platforms</strong> where each tenant defines their own automation, such as onboarding sequences, approval chains, or billing retry logic.</li> <li><strong>AI agent frameworks</strong> where agents generate and execute multi-step plans at runtime, surviving restarts and waiting for human approval between tool calls.</li> <li><strong>Multi-tenant job systems</strong> where each customer submits their own processing logic and every step persists progress and retries on failure.</li> </ul> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> createDynamicWorkflowEntrypoint,</span></span> <span class="line"><span class="nb-shiki-140thh"> DynamicWorkflowBinding,</span></span> <span class="line"><span class="nb-shiki-140thh"> wrapWorkflowBinding,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> WorkflowRunner,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/dynamic-workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-140thh"> { DynamicWorkflowBinding };</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> WORKFLOWS</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Workflow</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> LOADER</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkerLoader</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> loadTenant</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">tenantId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(tenantId, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> ({</span></span> <span class="line"><span class="nb-shiki-140thh"> compatibilityDate: </span><span class="nb-shiki-mdbnqw">"2026-01-01"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> mainModule: </span><span class="nb-shiki-mdbnqw">"index.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: { </span><span class="nb-shiki-mdbnqw">"index.js"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> fetchTenantCode</span><span class="nb-shiki-140thh">(tenantId) },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The Dynamic Worker uses this exactly like a real Workflow binding;</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // every create() is tagged with { tenantId } automatically.</span></span> <span class="line"><span class="nb-shiki-140thh"> env: { WORKFLOWS: </span><span class="nb-shiki-1t8gfj">wrapWorkflowBinding</span><span class="nb-shiki-140thh">({ tenantId }) },</span></span> <span class="line"><span class="nb-shiki-140thh"> }));</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// The entrypoint name must match `class_name` in the workflows binding of your Wrangler config file.</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> DynamicWorkflow</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createDynamicWorkflowEntrypoint</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;(</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">metadata</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> loadTenant</span><span class="nb-shiki-140thh">(env, metadata.tenantId </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">getEntrypoint</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"TenantWorkflow"</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-dzsirb"> unknown</span><span class="nb-shiki-1itgoe"> as</span><span class="nb-shiki-1t8gfj"> WorkflowRunner</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> tenantId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> request.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"x-tenant-id"</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> loadTenant</span><span class="nb-shiki-140thh">(env, tenantId).</span><span class="nb-shiki-1t8gfj">getEntrypoint</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>For a full walkthrough, refer to the <a href="https://developers.cloudflare.com/dynamic-workers/usage/dynamic-workflows/">Dynamic Workflows guide</a>.</p>Fri, 01 May 2026 00:00:00 GMTWorkflowsWorkflowsWorkersCloudflare One, Cloudflare WAN - Post-quantum IPsec interoperability with third-party deviceshttps://developers.cloudflare.com/changelog/post/2026-04-30-ipsec-post-quantum-third-party/https://developers.cloudflare.com/changelog/post/2026-04-30-ipsec-post-quantum-third-party/<p>Cloudflare IPsec now supports post-quantum key agreement with compatible third-party devices. <a href="https://www.cisco.com/" target="_blank" rel="noopener">Cisco<span class="external-link"> ↗</span></a> and <a href="https://www.fortinet.com/" target="_blank" rel="noopener">Fortinet<span class="external-link"> ↗</span></a> are the first third-party vendors validated to interoperate with Cloudflare IPsec using ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism).</p> <p>Post-quantum IPsec uses <a href="https://datatracker.ietf.org/doc/rfc9370/" target="_blank" rel="noopener">RFC 9370<span class="external-link"> ↗</span></a> and <a href="https://datatracker.ietf.org/doc/draft-ietf-ipsecme-ikev2-mlkem/" target="_blank" rel="noopener">draft-ietf-ipsecme-ikev2-mlkem<span class="external-link"> ↗</span></a> to negotiate hybrid key agreement during the IKEv2 <code>IKE_INTERMEDIATE</code> phase. This combines classical Diffie-Hellman (Group 20) with ML-KEM-768 or ML-KEM-1024 to protect against <a href="https://en.wikipedia.org/wiki/Harvest_now,_decrypt_later" target="_blank" rel="noopener">harvest-now, decrypt-later<span class="external-link"> ↗</span></a> attacks.</p> <p>Key details:</p> <ul> <li>Compatible with Cisco 8000 Series Secure Routers with IOS XR Release 26.1.1 and Fortinet FortiOS 7.6.6 and later.</li> <li>Uses ML-KEM-768 or ML-KEM-1024 as an additional Key Exchange to DH Group 20.</li> <li>Follows RFC 9370 and draft-ietf-ipsecme-ikev2-mlkem standards.</li> <li>No additional licensing required.</li> </ul> <p>Post-quantum IPsec with third-party devices is now generally available with confirmed interoperability for the platforms listed above. Cloudflare intends to support interoperability with more vendors as they build out support for draft-ietf-ipsecme-ikev2-mlkem. Contact your account team to discuss support for additional vendors.</p> <p>For supported key exchange methods and the list of validated platforms, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/#tested-third-party-vendor-interoperability">GRE and IPsec tunnels</a>.</p>Thu, 30 Apr 2026 00:00:00 GMTCloudflare OneCloudflare OneCloudflare WANData Loss Prevention - Classify sensitive content with Data Classificationhttps://developers.cloudflare.com/changelog/post/2026-04-30-data-classification/https://developers.cloudflare.com/changelog/post/2026-04-30-data-classification/<p>Cloudflare DLP now includes <strong>Data Classification</strong>, which lets administrators organize and label sensitive content using labels, templates, and reusable data classes.</p> <p>With Data Classification, administrators can define labels such as sensitivity schemas and levels, and data tag groups and tags. Administrators can also build from Cloudflare-managed templates and create reusable data classes that combine detection entries, other data classes, sensitivity levels, and data tags.</p> <p>You can then use those classifications in custom DLP profiles to identify the severity of sensitive content, understand where it exists, and apply that logic consistently across DLP profiles.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/data-classification/">Data Classification</a>.</p>Thu, 30 Apr 2026 00:00:00 GMTData Loss PreventionData Loss PreventionData Loss Prevention - New predefined detection entries are availablehttps://developers.cloudflare.com/changelog/post/2026-04-30-standalone-predefined-detection-entries/https://developers.cloudflare.com/changelog/post/2026-04-30-standalone-predefined-detection-entries/<p>Cloudflare DLP now includes new predefined detection entries.</p> <p>The expanded catalog includes detections for specific credential types, webhooks, addresses, tax identifiers, national IDs, financial data, and crypto wallets.</p> <p>Examples include <code>GitHub PAT</code>, <code>OpenAI API Key</code>, <code>Slack Webhook</code>, <code>Discord Webhook</code>, <code>US Physical Address</code>, and <code>Bitcoin Wallet</code>.</p> <p>For the full list, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/predefined-detection-entries/">Predefined detection entries</a>.</p>Thu, 30 Apr 2026 00:00:00 GMTData Loss PreventionData Loss PreventionSDK, Go SDK - Go SDK v7.0.0 Releasedhttps://developers.cloudflare.com/changelog/post/2026-04-30-go-sdk-v7.0.0/https://developers.cloudflare.com/changelog/post/2026-04-30-go-sdk-v7.0.0/<p>Full Changelog: <a href="https://github.com/cloudflare/cloudflare-go/compare/v6.10.0...v7.0.0" target="_blank" rel="noopener">v6.10.0...v7.0.0<span class="external-link"> ↗</span></a></p> <p>This is a major version release that includes breaking changes to three packages: <code>ai_search</code>, <code>email_security</code>, and <code>workers</code>. These changes reflect upstream API specification updates that improve type correctness and consistency.</p> <p><strong>Please ensure you read through the list of changes below before moving to this version</strong> - this will help you understand any down or upstream issues it may cause to your environments.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>See the <a href="https://github.com/cloudflare/cloudflare-go/blob/main/docs/migration-guides/v7.0.0-migration-guide.md" target="_blank" rel="noopener">v7.0.0 Migration Guide<span class="external-link"> ↗</span></a> for before/after code examples and actions needed for each change.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search---searchforagents-metadata-removed">AI Search - SearchForAgents Metadata Removed</h4><a class="anchor-link" href="#ai-search---searchforagents-metadata-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>SearchForAgents</code> nested type has been removed from all instance metadata structs. This field is no longer part of the API specification.</p> <p><strong>Removed Types:</strong></p> <ul> <li><code>InstanceNewResponseMetadataSearchForAgents</code></li> <li><code>InstanceUpdateResponseMetadataSearchForAgents</code></li> <li><code>InstanceListResponseMetadataSearchForAgents</code></li> <li><code>InstanceDeleteResponseMetadataSearchForAgents</code></li> <li><code>InstanceReadResponseMetadataSearchForAgents</code></li> <li><code>InstanceNewParamsMetadataSearchForAgents</code></li> <li><code>InstanceUpdateParamsMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceNewResponseMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceUpdateResponseMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceListResponseMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceDeleteResponseMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceReadResponseMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceNewParamsMetadataSearchForAgents</code></li> <li><code>NamespaceInstanceUpdateParamsMetadataSearchForAgents</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---path-parameter-type-changes">Email Security - Path Parameter Type Changes</h4><a class="anchor-link" href="#email-security---path-parameter-type-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Multiple Email Security settings sub-resources have changed their path parameter types from <code>int64</code> to <code>string</code>:</p> <ul> <li><code>AllowPolicies</code> (<code>policyID int64</code> -&gt; <code>policyID string</code>)</li> <li><code>BlockSenders</code> (<code>patternID int64</code> -&gt; <code>patternID string</code>)</li> <li><code>Domains</code> (<code>domainID int64</code> -&gt; <code>domainID string</code>)</li> <li><code>ImpersonationRegistry</code> (<code>displayNameID int64</code> -&gt; <code>impersonationRegistryID string</code>)</li> <li><code>TrustedDomains</code> (<code>trustedDomainID int64</code> -&gt; <code>trustedDomainID string</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---investigate-parameter-rename">Email Security - Investigate Parameter Rename</h4><a class="anchor-link" href="#email-security---investigate-parameter-rename"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>Investigate.Get</code>, <code>Investigate.Move.New</code>, and <code>Investigate.Reclassify.New</code> methods now use <code>investigateID</code> instead of <code>postfixID</code> as the path parameter name.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---domains-bulkdelete-method-removed">Email Security - Domains BulkDelete Method Removed</h4><a class="anchor-link" href="#email-security---domains-bulkdelete-method-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>SettingDomainService.BulkDelete</code> method and its associated types have been removed:</p> <ul> <li><code>SettingDomainBulkDeleteResponse</code></li> <li><code>SettingDomainBulkDeleteParams</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---trusteddomains-return-type-change">Email Security - TrustedDomains Return Type Change</h4><a class="anchor-link" href="#email-security---trusteddomains-return-type-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>SettingTrustedDomainService.New</code> now returns <code>*SettingTrustedDomainNewResponse</code> instead of <code>*SettingTrustedDomainNewResponseUnion</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---investigatemove-return-type-change">Email Security - Investigate.Move Return Type Change</h4><a class="anchor-link" href="#email-security---investigatemove-return-type-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>InvestigateMoveService.New</code> now returns <code>*pagination.SinglePage[InvestigateMoveNewResponse]</code> instead of <code>*[]InvestigateMoveNewResponse</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers---observability-telemetry-filter-restructuring">Workers - Observability Telemetry Filter Restructuring</h4><a class="anchor-link" href="#workers---observability-telemetry-filter-restructuring"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The observability telemetry filter parameter types have been restructured to support nested filter groups. New discriminated union types replace the previous flat filter arrays:</p> <ul> <li><code>ObservabilityTelemetryKeysParams.Filters</code> now accepts <code>FiltersObjectFilterUnion</code> (was <code>[]interface\{\}</code>)</li> <li><code>ObservabilityTelemetryQueryParams.Parameters.Filters</code> now accepts <code>FiltersObjectFilterUnion</code></li> <li><code>ObservabilityTelemetryValuesParams.Filters</code> now accepts <code>FiltersObjectFilterUnion</code></li> </ul> <p>New types include <code>FiltersObjectFiltersObject</code> (for group filters with <code>FilterCombination</code>) and <code>FiltersWorkersObservabilityFilterLeaf</code> (for leaf filters with typed <code>Operation</code>, <code>Type</code>, and <code>Value</code> fields).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="organizations---audit-logs-clientorganizationslogsaudit">Organizations - Audit Logs (<code>client.Organizations.Logs.Audit</code>)</h4><a class="anchor-link" href="#organizations---audit-logs-clientorganizationslogsaudit"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> Query organization audit logs with cursor-based pagination.</p> <ul> <li><code>List()</code> - Retrieve audit logs</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="browser-rendering-clientbrowserrendering">Browser Rendering (<code>client.BrowserRendering</code>)</h4><a class="anchor-link" href="#browser-rendering-clientbrowserrendering"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>client.BrowserRendering.Devtools.Browser.Targets.Close()</code> - Close a specific browser target (tab, page) by ID</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="queues-clientqueues">Queues (<code>client.Queues</code>)</h4><a class="anchor-link" href="#queues-clientqueues"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>client.Queues.GetMetrics()</code> - Retrieve queue metrics for a specific queue</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search-clientaisearch">AI Search (<code>client.AISearch</code>)</h4><a class="anchor-link" href="#ai-search-clientaisearch"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>WaitForCompletion</code> parameter to <code>NamespaceInstanceItemNewOrUpdateParams</code> and <code>NamespaceInstanceItemSyncParams</code> for synchronous indexing confirmation</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Magic Transit</strong>: <code>ConnectorService.List</code> parameter name corrected from <code>query</code> to <code>params</code> (non-functional, affects generated documentation only)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations">Deprecations</h4><a class="anchor-link" href="#deprecations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>None in this release.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/cloudflare-go/releases/tag/v7.0.0" target="_blank" rel="noopener">Download Go SDK v7.0.0<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/api/sdks/go/" target="_blank" rel="noopener">Go SDK documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/cloudflare-go/blob/main/docs/migration-guides/v7.0.0-migration-guide.md" target="_blank" rel="noopener">Migration Guide<span class="external-link"> ↗</span></a></li> </ul>Thu, 30 Apr 2026 00:00:00 GMTSDKSDKGo SDKR2 - Empty buckets and delete folders from the R2 dashboardhttps://developers.cloudflare.com/changelog/post/2026-04-30-r2-empty-bucket-folder-delete/https://developers.cloudflare.com/changelog/post/2026-04-30-r2-empty-bucket-folder-delete/<p>You can now empty an entire <a href="https://developers.cloudflare.com/r2/">R2</a> bucket or delete folders directly from the dashboard. Emptying a bucket is required before you can delete it. Previously, this required scripting or configuring <a href="https://developers.cloudflare.com/r2/buckets/object-lifecycles/">lifecycle rules</a>. Now, the dashboard can handle it in a single action.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="empty-a-bucket">Empty a bucket</h4><a class="anchor-link" href="#empty-a-bucket"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Go to your bucket's <strong>Settings</strong> tab and select <strong>Empty</strong> under the <strong>Empty Bucket</strong> section. This deletes all objects in the bucket while preserving the bucket and its configuration. For large buckets, the operation runs in the background and the dashboard displays progress.</p> <p>Emptying a bucket is also a prerequisite for deleting it. The dashboard now guides you through both steps in one place.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3380,height=1776,format=webp/_astro/empty-bucket-changelog.DjuMZppm.png" alt="Empty Bucket and Delete Bucket sections in the R2 dashboard Settings tab" loading="lazy" decoding="async" width="3380" height="1776"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="delete-folders">Delete folders</h4><a class="anchor-link" href="#delete-folders"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>R2 uses a flat object structure. The dashboard groups objects that share a common prefix into folders when the <strong>View prefixes as directories</strong> checkbox is selected. Deleting a folder removes every object under that prefix.</p> <p>From the <strong>Objects</strong> tab, you can select one or more folders and delete them alongside individual objects.</p> <p>For step-by-step instructions, refer to <a href="https://developers.cloudflare.com/r2/buckets/delete-buckets/">Delete buckets</a> and <a href="https://developers.cloudflare.com/r2/objects/delete-objects/">Delete objects</a>.</p>Thu, 30 Apr 2026 00:00:00 GMTR2R2Radar - Cloud Observatory connection metrics improvementshttps://developers.cloudflare.com/changelog/post/2026-04-30-radar-cloud-observatory-connection-metrics/https://developers.cloudflare.com/changelog/post/2026-04-30-radar-cloud-observatory-connection-metrics/<p>The <a href="https://radar.cloudflare.com/cloud-observatory" target="_blank" rel="noopener">Cloud Observatory<span class="external-link"> ↗</span></a> on <a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now provides improved connection metric insights, offering new ways to explore TCP round-trip time, TCP handshake duration, TLS handshake duration, and response header receive duration across cloud provider origin servers.</p> <p>The <a href="https://radar.cloudflare.com/cloud-observatory#connection-metrics" target="_blank" rel="noopener">Cloud Observatory overview<span class="external-link"> ↗</span></a> now shows connection metrics broken down by cloud provider, making it easy to compare connection performance across Amazon Web Services, Google Cloud, Microsoft Azure, and Oracle Cloud.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2338,height=1408,format=webp/_astro/cloud-observatory-connection-metrics-by-provider.Bk9nSitV.png" alt="Screenshot of Cloud Observatory connection metrics broken down by cloud provider" loading="lazy" decoding="async" width="2338" height="1408"> <p>Each <a href="https://radar.cloudflare.com/cloud-observatory/amazon#connection-metrics" target="_blank" rel="noopener">provider page<span class="external-link"> ↗</span></a> now shows connection metrics for the top five regions, with a selector to rank by lowest or highest values.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2338,height=1414,format=webp/_astro/cloud-observatory-connection-metrics-by-region.CbHAKXoc.png" alt="Screenshot of Cloud Observatory connection metrics broken down by region for a provider" loading="lazy" decoding="async" width="2338" height="1414"> <p>Each <a href="https://radar.cloudflare.com/cloud-observatory/amazon/us-east-1#connection-metrics" target="_blank" rel="noopener">region page<span class="external-link"> ↗</span></a> now displays connection metrics as percentile distributions (25th percentile, median, and 75th percentile), providing insight into the range and variability of connection times.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2340,height=1288,format=webp/_astro/cloud-observatory-connection-metrics-percentiles.DJ9eAE0-.png" alt="Screenshot of Cloud Observatory connection metrics with percentile distribution for a region" loading="lazy" decoding="async" width="2340" height="1288"> <p>These views are also available through the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/"><code>Origins</code> API</a>, using the <code>timeseries_groups</code> endpoint with the <code>ORIGIN</code>, <code>REGION</code>, or <code>PERCENTILE</code> dimension.</p>Thu, 30 Apr 2026 00:00:00 GMTRadarRadarRadar - Dark mode support on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-04-30-radar-dark-mode/https://developers.cloudflare.com/changelog/post/2026-04-30-radar-dark-mode/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now supports <strong>dark mode</strong>. A theme selector in the upper right corner of the page lets users explicitly choose between three display options:</p> <ul> <li><strong>Light</strong> — standard light theme</li> <li><strong>Dark</strong> — full dark theme</li> <li><strong>System</strong> — follows the operating system preference</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=404,height=296,format=webp/_astro/dark-mode-theme-selector.D5ih8e4q.png" alt="Screenshot of the theme selector showing Light, Dark, and System options" loading="lazy" decoding="async" width="404" height="296"> <p>The selected theme applies consistently across all Radar pages and widgets.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3818,height=1682,format=webp/_astro/dark-mode-overview.D-39RJlY.png" alt="Screenshot of the Cloudflare Radar overview page in dark mode" loading="lazy" decoding="async" width="3818" height="1682"> <p>The theme choice also applies to shared and embedded graphs.</p> <p>Try it out at <a href="https://radar.cloudflare.com" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a>.</p>Thu, 30 Apr 2026 00:00:00 GMTRadarRadarSDK - Cloudflare Python SDK v5.0.0 Releasedhttps://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-python-v5.0.0/https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-python-v5.0.0/<p>Full Changelog: <a href="https://github.com/cloudflare/cloudflare-python/compare/v4.3.1...v5.0.0" target="_blank" rel="noopener">v4.3.1...v5.0.0<span class="external-link"> ↗</span></a></p> <p>This is a major release of the Cloudflare Python SDK. It drops support for Python 3.8, adds 11 new API services, introduces optional aiohttp backend support for improved async concurrency, and includes hundreds of type and method updates across the entire API surface.</p> <p><strong>Please review the breaking changes below before upgrading.</strong> A migration guide is available at <a href="https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md" target="_blank" rel="noopener">v5.0.0 Migration Guide<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Python 3.8 is no longer supported.</strong> The minimum required version is now Python 3.9.</li> <li><strong><code>typing-extensions</code> minimum version bumped</strong> from <code>&gt;=4.10</code> to <code>&gt;=4.14</code>.</li> </ul> <p>The following resources have breaking changes. See the <a href="https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md" target="_blank" rel="noopener">v5.0.0 Migration Guide<span class="external-link"> ↗</span></a> for detailed migration instructions.</p> <ul> <li><code>abusereports</code></li> <li><code>acm.totaltls</code></li> <li><code>apigateway.configurations</code></li> <li><code>cloudforceone.threatevents</code></li> <li><code>d1.database</code></li> <li><code>intel.indicatorfeeds</code></li> <li><code>logpush.edge</code></li> <li><code>origintlsclientauth.hostnames</code></li> <li><code>queues.consumers</code></li> <li><code>radar.bgp</code></li> <li><code>rulesets.rules</code></li> <li><code>schemavalidation.schemas</code></li> <li><code>snippets</code></li> <li><code>zerotrust.dlp</code></li> <li><code>zerotrust.networks</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="aiohttp-backend-support">aiohttp Backend Support</h4><a class="anchor-link" href="#aiohttp-backend-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The async client now supports an optional <code>aiohttp</code> HTTP backend for improved concurrency performance. Install with <code>pip install cloudflare[aiohttp]</code> and use <code>DefaultAioHttpClient()</code> as the <code>http_client</code> parameter.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="python-313-and-314-support">Python 3.13 and 3.14 Support</h4><a class="anchor-link" href="#python-313-and-314-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Python 3.13 and 3.14 are now tested and supported.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-services">New Services</h4><a class="anchor-link" href="#new-services"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following top-level resources are new in this release:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Resource</th> <th>Client Path</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>AI Search</td> <td><code>aisearch</code></td> <td>AI-powered search capabilities</td> </tr> <tr> <td>Connectivity</td> <td><code>connectivity</code></td> <td>Connectivity testing and diagnostics</td> </tr> <tr> <td>Email Sending</td> <td><code>email_sending</code></td> <td>Email send and send_raw endpoints</td> </tr> <tr> <td>Fraud</td> <td><code>fraud</code></td> <td>Fraud detection and prevention</td> </tr> <tr> <td>Google Tag Gateway</td> <td><code>google_tag_gateway</code></td> <td>Google Tag Gateway management</td> </tr> <tr> <td>Organizations</td> <td><code>organizations</code></td> <td>Organization audit logs and management</td> </tr> <tr> <td>R2 Data Catalog</td> <td><code>r2_data_catalog</code></td> <td>R2 Data Catalog operations</td> </tr> <tr> <td>Realtime Kit</td> <td><code>realtime_kit</code></td> <td>Realtime communication (Calls/TURN)</td> </tr> <tr> <td>Resource Tagging</td> <td><code>resource_tagging</code></td> <td>Resource tagging and labeling</td> </tr> <tr> <td>Token Validation</td> <td><code>token_validation</code></td> <td>Token validation configuration and rules</td> </tr> <tr> <td>Vulnerability Scanner</td> <td><code>vulnerability_scanner</code></td> <td>Vulnerability scanning, credential sets, and target environments</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-endpoints-on-existing-services">New Endpoints on Existing Services</h4><a class="anchor-link" href="#new-endpoints-on-existing-services"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>api_gateway</strong>: Labels endpoints</li> <li><strong>billing</strong>: Billable usage PayGo endpoint</li> <li><strong>brand_protection</strong>: v2 endpoints</li> <li><strong>browser_rendering</strong>: DevTools methods</li> <li><strong>cache</strong>: Origin cloud regions resource</li> <li><strong>custom_origin_trust_store</strong>: Custom origin trust store</li> <li><strong>dns</strong>: <code>dns_records/usage</code> endpoints</li> <li><strong>email_security</strong>: Phishguard reports endpoint</li> <li><strong>iam</strong>: User groups and user group members resources</li> <li><strong>radar</strong>: Botnet Threat Feed and Post-Quantum endpoints</li> <li><strong>workers</strong>: Observability Destinations resources</li> <li><strong>zero_trust</strong>: Access Users, DEX rules, Device IP Profile, Device Subnet, WARP Connector connections and failover, WARP Subnet, Gateway PAC files</li> <li><strong>zones</strong>: Zone environments endpoints</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Fixed <code>polymorphic_serialization</code> parameter in <code>model_dump</code> overrides</li> <li>Added <code>BaseModel</code> base to response <code>SchemaFieldStruct</code>/<code>SchemaFieldList</code> stubs in Pipelines</li> <li>Added missing <code>model_rebuild</code>/<code>update_forward_refs</code> for <code>SharedEntryCustomEntry</code> classes in DLP</li> <li>Made <code>RunQueryParametersNeedleValue</code> a <code>BaseModel</code> with <code>arbitrary_types_allowed</code> in Workers</li> <li>Removed duplicate <code>notification_url</code> field in webhook response types for Stream</li> <li>Resolved pre-existing codegen type errors</li> <li>Fixed <code>type: ignore[call-arg]</code> placement for mypy compatibility in Radar</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations">Deprecations</h4><a class="anchor-link" href="#deprecations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Resources with <code>@deprecated</code> annotations on some methods include: <code>accounts</code>, <code>addressing</code>, <code>ai-gateway</code>, <code>aisearch</code>, <code>api-gateway</code>, <code>billing</code>, <code>cloudforce-one</code>, <code>dns</code>, <code>email-routing</code>, <code>email-security</code>, <code>filters</code>, <code>firewall</code>, <code>images</code>, <code>intel</code>, <code>kv</code>, <code>logpush</code>, <code>origin-tls-client-auth</code>, <code>pages</code>, <code>pipelines</code>, <code>radar</code>, <code>rate-limits</code>, <code>registrar</code>, <code>rulesets</code>, <code>ssl</code>, <code>user</code>, <code>workers</code>, <code>workers-for-platforms</code>, <code>zero-trust</code>, <code>zones</code></p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/cloudflare-python/releases/tag/v5.0.0" target="_blank" rel="noopener">Download Python SDK v5.0.0<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/api/sdks/python/" target="_blank" rel="noopener">Python SDK documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md" target="_blank" rel="noopener">Migration Guide<span class="external-link"> ↗</span></a></li> </ul>Thu, 30 Apr 2026 00:00:00 GMTSDKSDKSDK - Cloudflare TypeScript SDK v6.0.0 Releasedhttps://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-typescript-v6.0.0/https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-typescript-v6.0.0/<p>Full Changelog: <a href="https://github.com/cloudflare/cloudflare-typescript/compare/v6.0.0-beta.2...v6.0.0" target="_blank" rel="noopener">v6.0.0-beta.2...v6.0.0<span class="external-link"> ↗</span></a></p> <p>This is a major version release of the Cloudflare TypeScript SDK. It includes 11 entirely new top-level API resources, new sub-resources and methods across 50+ existing resources, SDK infrastructure improvements, and breaking changes to the generated API surface from the v5.x line.</p> <p><strong>Please ensure you read through the list of changes below before moving to this version</strong> - this will help you understand any down or upstream issues it may cause to your environments.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sdk-infrastructure">SDK Infrastructure</h4><a class="anchor-link" href="#sdk-infrastructure"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Retry-After handling changed</strong>: The SDK now respects any server-specified <code>Retry-After</code> value for rate-limited requests. Previously, values over 60 seconds were ignored and a default backoff was used instead.</li> <li><strong>Empty response handling</strong>: Responses with <code>content-length: 0</code> now return <code>undefined</code> instead of attempting to parse the body.</li> <li><strong>Environment variable reading</strong>: Empty string env vars (for example, <code>CLOUDFLARE_API_TOKEN=""</code>) are now treated as unset.</li> <li><strong>Path query parameter merging</strong>: URL search params embedded in endpoint paths are now extracted and merged into the query object.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="removed-endpoints-17">Removed Endpoints (17)</h4><a class="anchor-link" href="#removed-endpoints-17"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>17 HTTP endpoints were removed from the SDK, affecting <code>abuse-reports</code>, <code>cloudforce-one</code>, <code>dlp/profiles/predefined</code>, <code>email-security/investigate</code>, <code>email-security/settings</code>, and <code>intel/ip-list</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="method-signature-changes">Method Signature Changes</h4><a class="anchor-link" href="#method-signature-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>client.ai.toMarkdown.transform(file, \{ ...params \})</code> -&gt; <code>client.ai.toMarkdown.transform(\{ ...params \})</code> -- <code>file</code> moved from positional arg into params body</li> <li><code>client.radar.ai.toMarkdown.create(body, \{ ...params \})</code> -&gt; <code>client.radar.ai.toMarkdown.create(\{ ...params \})</code> -- <code>body</code> moved from positional arg into params</li> <li><code>client.abuseReports.create(reportType, \{ ...params \})</code> -&gt; <code>client.abuseReports.create(reportParam, \{ ...params \})</code> -- positional arg renamed</li> <li><code>client.iam.userGroups.members.create(userGroupId, [ ...body ])</code> -&gt; <code>client.iam.userGroups.members.create(userGroupId, [ ...members ])</code> -- body array param renamed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="renamed-client-paths">Renamed Client Paths</h4><a class="anchor-link" href="#renamed-client-paths"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>client.originTLSClientAuth.hostnames.certificates</code> -&gt; <code>client.originTLSClientAuth.zoneCertificates</code></li> <li><code>client.radar.netflows</code> -&gt; <code>client.radar.netFlows</code> (casing change)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="return-type-changes-179">Return Type Changes (179)</h4><a class="anchor-link" href="#return-type-changes-179"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>133 methods now return <code>null</code></strong> instead of a typed response object. This primarily affects delete operations across <code>accounts</code>, <code>cache</code>, <code>d1</code>, <code>filters</code>, <code>firewall</code>, <code>hyperdrive</code>, <code>iam</code>, <code>kv</code>, <code>logpush</code>, <code>logs</code>, <code>r2</code>, <code>stream</code>, <code>workers</code>, <code>zero-trust</code>, <code>zones</code>, and others.</li> <li><strong>17 methods changed pagination type</strong> (for example, <code>KeysCursorPaginationAfter</code> -&gt; <code>KeysCursorLimitPagination</code>).</li> <li><strong>29 methods changed to a different named type</strong> (for example, <code>CloudflaredCreateResponse</code> -&gt; <code>CloudflareTunnel</code>).</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="removed-types-43">Removed Types (43)</h4><a class="anchor-link" href="#removed-types-43"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>24 shared types removed from root namespace (<code>ASN</code>, <code>AuditLog</code>, <code>Member</code>, <code>Permission</code>, <code>Role</code>, <code>Subscription</code>, <code>Token</code>, etc.). 19 response types consolidated or renamed.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resource-restructuring">Resource Restructuring</h4><a class="anchor-link" href="#resource-restructuring"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>19 resources were restructured from single files to directories. Public API client paths are unchanged, but deep imports may break.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-top-level-resources">New Top-Level Resources</h4><a class="anchor-link" href="#new-top-level-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>11 entirely new resources added to the client:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Resource</th> <th>Client Path</th> <th>Methods</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>AI Search</td> <td><code>client.aiSearch</code></td> <td>46</td> <td>Instances, namespaces, tokens, and items</td> </tr> <tr> <td>Connectivity</td> <td><code>client.connectivity</code></td> <td>5</td> <td>Directory service APIs</td> </tr> <tr> <td>Email Sending</td> <td><code>client.emailSending</code></td> <td>7</td> <td>Send and send_raw endpoints</td> </tr> <tr> <td>Fraud</td> <td><code>client.fraud</code></td> <td>2</td> <td>Fraud detection API</td> </tr> <tr> <td>Google Tag Gateway</td> <td><code>client.googleTagGateway</code></td> <td>2</td> <td>Google Tag Gateway management</td> </tr> <tr> <td>Organizations</td> <td><code>client.organizations</code></td> <td>8</td> <td>Organization profiles and audit logs</td> </tr> <tr> <td>R2 Data Catalog</td> <td><code>client.r2DataCatalog</code></td> <td>11</td> <td>R2 Data Catalog routes</td> </tr> <tr> <td>Realtime Kit</td> <td><code>client.realtimeKit</code></td> <td>54</td> <td>Realtime Kit APIs</td> </tr> <tr> <td>Resource Tagging</td> <td><code>client.resourceTagging</code></td> <td>9</td> <td>Resource tagging routes</td> </tr> <tr> <td>Token Validation</td> <td><code>client.tokenValidation</code></td> <td>13</td> <td>Token validation rules</td> </tr> <tr> <td>Vulnerability Scanner</td> <td><code>client.vulnerabilityScanner</code></td> <td>21</td> <td>Vulnerability scanning</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-sub-resources-on-existing-resources">New Sub-Resources on Existing Resources</h4><a class="anchor-link" href="#new-sub-resources-on-existing-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>browser-rendering</strong>: <code>crawl</code>, <code>devtools</code> - Crawl endpoints and DevTools methods</li> <li><strong>cache</strong>: <code>origin-cloud-regions</code> - Origin cloud regions resource</li> <li><strong>dns</strong>: <code>usage</code> - DNS records usage endpoints</li> <li><strong>d1</strong>: <code>time-travel</code> - Time travel get_bookmark and restore</li> <li><strong>email-security</strong>: <code>phishguard</code> - Phishguard reports endpoint</li> <li><strong>pipelines</strong>: <code>sinks</code>, <code>streams</code> - Pipelines restructure</li> <li><strong>radar</strong>: <code>agent-readiness</code>, <code>geolocations</code>, <code>post-quantum</code> - New analytics endpoints</li> <li><strong>workers</strong>: <code>observability</code> - Observability destinations</li> <li><strong>zones</strong>: <code>environments</code> - Zone environments endpoints</li> <li><strong>api-gateway</strong>: <code>labels</code> - Labels endpoints</li> <li><strong>brand-protection</strong>: <code>v2</code> - V2 endpoints</li> <li><strong>alerting</strong>: <code>silences</code> - Alert silencing API</li> <li><strong>billing</strong>: <code>usage</code> - Billable usage PayGo endpoint</li> <li><strong>iam</strong>: <code>sso</code> - SSO Connectors resource</li> <li><strong>queues</strong>: <code>getMetrics</code> method - Queues metrics endpoint</li> <li><strong>registrar</strong>: <code>registration-status</code>, <code>update-status</code> - Registrar API convergence</li> <li><strong>zero-trust</strong>: DLP settings, DEX rules, Access Users, WARP Connector, WARP Subnets, Gateway PAC files, Gateway tenants</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Resolved type errors from codegen overwriting manual fixes</li> <li>Fixed <code>post()</code> usage for to-markdown endpoints to resolve async type error</li> <li>Added least-privilege permissions to all workflow jobs</li> <li>Reverted erroneous removal of rulesets resource methods and types</li> <li>Resolved prettier formatting errors in codegen output</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations">Deprecations</h4><a class="anchor-link" href="#deprecations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following resources now include <code>@deprecated</code> annotations on some methods:</p> <p><code>accounts</code>, <code>addressing</code>, <code>ai-gateway</code>, <code>aisearch</code>, <code>api-gateway</code>, <code>billing</code>, <code>cloudforce-one</code>, <code>custom-nameservers</code>, <code>dns</code>, <code>email-routing</code>, <code>email-security</code>, <code>filters</code>, <code>firewall</code>, <code>images</code>, <code>intel</code>, <code>keyless-certificates</code>, <code>kv</code>, <code>logpush</code>, <code>origin-tls-client-auth</code>, <code>page-shield</code>, <code>pages</code>, <code>pipelines</code>, <code>radar</code>, <code>rate-limits</code>, <code>registrar</code>, <code>rulesets</code>, <code>ssl</code>, <code>user</code>, <code>workers</code>, <code>workers-for-platforms</code>, <code>zero-trust</code>, <code>zones</code></p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/cloudflare-typescript/releases/tag/v6.0.0" target="_blank" rel="noopener">Download TypeScript SDK v6.0.0<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/api/sdks/typescript/" target="_blank" rel="noopener">TypeScript SDK documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/cloudflare-typescript/blob/main/CHANGELOG.md" target="_blank" rel="noopener">Full Changelog<span class="external-link"> ↗</span></a></li> </ul>Thu, 30 Apr 2026 00:00:00 GMTSDKSDKSpeed - Shared dictionaries passthrough now in open betahttps://developers.cloudflare.com/changelog/post/2026-04-30-shared-dictionaries-passthrough-beta/https://developers.cloudflare.com/changelog/post/2026-04-30-shared-dictionaries-passthrough-beta/ <p><a href="https://developers.cloudflare.com/speed/optimization/content/shared-dictionaries/">Shared dictionaries</a> (<a href="https://www.rfc-editor.org/rfc/rfc9842.html" target="_blank" rel="noopener">RFC 9842<span class="external-link"> ↗</span></a>) let an origin compress a response against a previous version of the same resource that the browser already has cached, so only the difference between versions travels over the wire. Shared dictionaries passthrough is now in open beta on all plans.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In passthrough mode, Cloudflare:</p> <ul> <li>Forwards the <code>Use-As-Dictionary</code> and <code>Available-Dictionary</code> headers between client and origin without modification.</li> <li>Treats <code>dcb</code> (Dictionary-Compressed Brotli) and <code>dcz</code> (Dictionary-Compressed Zstandard) as valid <code>Content-Encoding</code> values end to end, without recompressing them.</li> <li>Extends the cache key to vary on <code>Available-Dictionary</code> and <code>Accept-Encoding</code> so each delta-compressed variant is cached correctly.</li> </ul> <p>Your origin manages the dictionary lifecycle: deciding which assets are dictionaries, attaching <code>Use-As-Dictionary</code> headers, and producing deltas in response to <code>Available-Dictionary</code> requests. Cloudflare handles the transport and the cache.</p> <p>In internal testing on a 272 KB JavaScript bundle, the asset shrinks from 92.1 KB with Gzip to 2.6 KB with delta Zstandard against the previous version — a 97% reduction over standard compression — with download times improving by 81–89% versus Gzip.</p> <p>Shared dictionaries work with browsers that advertise <code>dcb</code> or <code>dcz</code> in <code>Accept-Encoding</code>. Today, this includes Chrome 130 or later and Edge 130 or later.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Turn on passthrough for your zone with a single API call:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/zones/</span><span class="nb-shiki-140thh">$ZONE_ID</span><span class="nb-shiki-mdbnqw">/settings/shared_dictionary_mode"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> PATCH</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --json</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "value": "passthrough"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>You can also turn it on under <strong>Speed</strong> &gt; <strong>Settings</strong> &gt; <strong>Content Optimization</strong> in the <a href="https://dash.cloudflare.com/?to=/:account/:zone/speed/optimization" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>. For full origin setup instructions and a working test recipe, refer to <a href="https://developers.cloudflare.com/speed/optimization/content/shared-dictionaries/">Shared dictionaries</a>, or try the live demo at <a href="https://canicompress.com/" target="_blank" rel="noopener">canicompress.com<span class="external-link"> ↗</span></a>.</p>Thu, 30 Apr 2026 00:00:00 GMTSpeedSpeedWAF - WAF Release - 2026-04-30 - Emergencyhttps://developers.cloudflare.com/changelog/post/2026-04-30-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2026-04-30-emergency-waf-release/ <p>This emergency release introduces a new rule to block a cPanel &amp; WHM Authentication Bypass related to CVE-2026-41940.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-41940: A critical authentication bypass vulnerability in cPanel &amp; WHM allows unauthenticated remote attackers to bypass authentication mechanisms and gain unauthorized administrative access to the web hosting control panel. This vulnerability affects the session validation logic, enabling attackers to craft malicious requests that circumvent normal authentication checks.</li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation allows unauthenticated attackers to gain administrative control over affected cPanel &amp; WHM installations. This leads to complete server compromise, potential theft or manipulation of hosted data, and significant service disruption across managed environments.</p> <p>We strongly recommend applying official vendor patches for cPanel &amp; WHM immediately to address the underlying vulnerability.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fb29b1b660864285a5ebac86eb2b9e2f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...eb2b9e2f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>cPanel - Auth Bypass - CVE:CVE-2026-41940</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Thu, 30 Apr 2026 00:00:00 GMTWAFWAFCloudflare Web Analytics - Web Analytics adds Navigation Type filtering and reportinghttps://developers.cloudflare.com/changelog/post/2026-04-30-rum-navigation-types/https://developers.cloudflare.com/changelog/post/2026-04-30-rum-navigation-types/<p>Cloudflare Web Analytics now supports <strong>Navigation Type</strong> reporting and filtering.</p> <p>This update allows developers and performance analysts to see how users are navigating between pages — whether through a link click or form submission, a page reload, or using the browser's back/forward buttons — and whether a browser cache hit occurred for these behaviors.</p> <p>Understanding navigation types is critical for optimizing user experience. For example, if a high volume of your traffic consists of "Back-forward" navigations versus "Back-forward Cache", those visitors are not benefiting from the Back/Forward Cache (bfcache) and therefore are experiencing higher load times due to potentially unnecessary network requests.</p> <p>The same applies for regular "Navigate" entries — where "Navigate Cache", "Navigate Prefetch Cache" and "Prerender" would provide instant document retrieval — and "Reload", where "Reload cache" would be more optimal.</p> <p>A high volume of "Reload" entries can also indicate a potential stability problem with your website.</p> <p>By identifying these patterns, you can tune your browser caching strategies to ensure HTML documents are served instantaneously from local caches rather than requiring a roundtrip to the network.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/web-analytics/data-metrics/dimensions/#navigation-types">Navigation Types</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Monitor Cache Effectiveness:</strong> See how often your site is served from the HTTP cache or bfcache.</li> <li><strong>Identify Performance Bottlenecks:</strong> Filter by the different types to understand performance opportunity of improving browser cache hit ratio.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="analyze-navigation-types-in-the-cloudflare-dashboard">Analyze navigation types in the Cloudflare dashboard</h4><a class="anchor-link" href="#analyze-navigation-types-in-the-cloudflare-dashboard"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now find the <strong>Navigation Type</strong> dimension in the Web Analytics dashboard. You can filter to include/exclude one or more specific types using "equals", "does not equal", "in", or "not in" matchers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2646,height=1040,format=webp/_astro/dash-web_analytics-navigation-type-filter.Cculflhp.png" alt="Navigation Type filter" loading="lazy" decoding="async" width="2646" height="1040"> <p>To check the list of popular navigation types, select <strong>Page views</strong> on the Web Analytics sidebar and scroll down to the bottom:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2076,height=500,format=webp/_astro/dash-web_analytics-navigation-types-list.CWaiEQzO.png" alt="Navigation Types list in Page Views tab" loading="lazy" decoding="async" width="2076" height="500">Thu, 30 Apr 2026 00:00:00 GMTCloudflare Web AnalyticsCloudflare Web AnalyticsDigital Experience Monitoring - Digital experience tests to authenticated resources and enhanced configurationhttps://developers.cloudflare.com/changelog/post/2026-04-29-dex-tests-to-auth/https://developers.cloudflare.com/changelog/post/2026-04-29-dex-tests-to-auth/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/tests/">Digital experience tests</a> now support testing applications protected by Cloudflare Access or third-party authentication. All authentication secrets are managed via <a href="https://developers.cloudflare.com/secrets-store/">Cloudflare Secret Store</a>.</p> <p>Digital experience tests also have enhanced configuration options including:</p> <ul> <li>New HTTP methods (DELETE, PATCH, POST, PUT)</li> <li>Secret Store headers, custom plain text headers, and custom request bodies</li> <li>Advanced settings: follow redirects, response bodies, response headers, and allow untrusted certificates</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2840,height=1374,format=webp/_astro/dex_test_auth_config.CD3G3zb_.png" alt="Digital experience test configuration for Cloudflare Access applications" loading="lazy" decoding="async" width="2840" height="1374"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2840,height=1496,format=webp/_astro/dex_test_enhanced_config.Nsv7Vcob.png" alt="Digital experience enhanced test configuration" loading="lazy" decoding="async" width="2840" height="1496">Wed, 29 Apr 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringCloudflare Fundamentals - Instant Bank Payments via Linkhttps://developers.cloudflare.com/changelog/post/2026-04-29-instant-bank-payments-via-link/https://developers.cloudflare.com/changelog/post/2026-04-29-instant-bank-payments-via-link/<p>You can now pay for Cloudflare services directly from your bank account using <a href="https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/">Instant Bank Payments via Link</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://link.co/" target="_blank" rel="noopener">Link<span class="external-link"> ↗</span></a> now supports bank account payments in addition to cards. If you have a bank account saved in Link, it appears as a payment option at checkout. If not, you can connect one during the checkout flow.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=413,height=562,format=webp/_astro/2026-04-29-instant-bank-payments-link.ChGd-t7M.png" alt="Instant Bank Payments via Link at checkout" loading="lazy" decoding="async" width="413" height="562"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-use-it">How to use it</h4><a class="anchor-link" href="#how-to-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>During checkout, select your bank account from your saved Link payment methods.</li> <li>Confirm the payment.</li> </ol> <p>After your first Link authentication, your bank account is available for future purchases without re-entering details.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="who-is-eligible">Who is eligible</h4><a class="anchor-link" href="#who-is-eligible"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Instant Bank Payments via Link is available to US-based self-serve accounts across all Cloudflare products. Your existing cards remain available at checkout.</p> <p>Bank-based Link payments appear in your billing history with the payment method shown as <code>link</code> and last four digits as <code>0000</code>. For details, refer to the <a href="https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/">Instant Bank Payments via Link documentation</a>.</p>Wed, 29 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsGateway - Gateway Authorization Proxy and hosted PAC files are now generally availablehttps://developers.cloudflare.com/changelog/post/2026-04-29-gateway-authorization-proxy-pac-files-ga/https://developers.cloudflare.com/changelog/post/2026-04-29-gateway-authorization-proxy-pac-files-ga/<p>The <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint">Gateway Authorization Proxy</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file">hosted PAC files</a> are now generally available for all plan types.</p> <p>Authorization proxy endpoints add an identity-aware option alongside the existing <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint">source IP proxy endpoints</a>, using <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a> authentication to verify who a user is before applying Gateway filtering — without installing the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare One Client</a>. Cloudflare-hosted PAC files let you create and distribute PAC files directly from Cloudflare One on Cloudflare's global network.</p> <p>These features are ideal for environments where deploying a device client is not an option, such as virtual desktops (VDI) or compliance-restricted endpoints.</p> <p>To get started, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/">proxy endpoints documentation</a>.</p>Wed, 29 Apr 2026 00:00:00 GMTGatewayGatewayHyperdrive - Hyperdrive support for private databases with Workers VPChttps://developers.cloudflare.com/changelog/post/2026-04-29-hyperdrive-vpc-private-databases/https://developers.cloudflare.com/changelog/post/2026-04-29-hyperdrive-vpc-private-databases/<p>You can now connect Hyperdrive to a private database through a <a href="https://developers.cloudflare.com/workers-vpc/">Workers VPC service</a>. This is the recommended way to connect Hyperdrive to a private database that is not exposed to the public Internet.</p> <p>When creating a Hyperdrive configuration in the Cloudflare dashboard, choose <strong>Connect to private database</strong> and then <strong>Workers VPC</strong>. From there, you can select an existing VPC service or create a new one inline by picking a Cloudflare Tunnel and entering your origin host and TCP port.</p> <p>You can also create a Hyperdrive configuration backed by a Workers VPC service from the command line:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> hyperdrive</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-vpc-database</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --service-id</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">YOUR_VPC_SERVICE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --database</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">DATABASE_NAM</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --user</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">DATABASE_USE</span><span class="nb-shiki-140thh">R</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --password</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">DATABASE_PASSWOR</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --scheme</span><span class="nb-shiki-mdbnqw"> postgresql</span></span></code></pre></figure> <p>Workers VPC services are reusable across Hyperdrive configurations and can also be bound directly to Workers, so you can share the same private connection across multiple products.</p> <p>To get started, refer to <a href="https://developers.cloudflare.com/hyperdrive/configuration/connect-to-private-database-vpc/">Connect Hyperdrive to a private database using Workers VPC</a>.</p>Wed, 29 Apr 2026 00:00:00 GMTHyperdriveHyperdriveDigital Experience Monitoring - Internet outage notifications for deviceshttps://developers.cloudflare.com/changelog/post/2026-04-28-dex-internet-outage-notification/https://developers.cloudflare.com/changelog/post/2026-04-28-dex-internet-outage-notification/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience</a> will display a dashboard notification when an Internet outage or traffic anomaly may impact a <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare One Client</a> device based on its geographic location or network connection.</p> <p>This Internet outage and traffic anomaly data is pulled from <a href="https://radar.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a>. All Internet outage and traffic anomaly observations can be viewed in the <a href="https://radar.cloudflare.com/outage-center" target="_blank" rel="noopener">Radar Outage Center<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2076,height=314,format=webp/_astro/dex_radar_ux_notification.CpdrUVYA.png" alt="Digital Experience Monitoring dashboard notification for Internet outage impacting Cloudflare One Client devices" loading="lazy" decoding="async" width="2076" height="314"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2068,height=909,format=webp/_astro/dex_radar_analytics.GaPxWM6C.png" alt="Digital Experience Monitoring dashboard analytics for Internet outage impacting Cloudflare One Client devices" loading="lazy" decoding="async" width="2068" height="909">Tue, 28 Apr 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringDigital Experience Monitoring - Cloudflare One Client speed testshttps://developers.cloudflare.com/changelog/post/2026-04-28-dex-speed-test/https://developers.cloudflare.com/changelog/post/2026-04-28-dex-speed-test/<p>IT teams can now remotely run speed tests from the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare One Client</a> to Cloudflare's network edge.</p> <p>Each speed test includes the following metrics:</p> <ul> <li>Internet speed: download and upload throughput</li> <li>Latency: download, upload, unloaded latency, and jitter</li> <li>Network quality score: video streaming, webchat/real-time communication (RTC)</li> </ul> <p>In the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Zero Trust</strong> &gt; <strong>Insights</strong> &gt; <strong>Digital experience</strong> &gt; <strong>Diagnostics</strong> and select <strong>Run diagnostics</strong> to use the feature today.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2906,height=1730,format=webp/_astro/dex_speed_test.DukupcRs.png" alt="Cloudflare One client speed test result" loading="lazy" decoding="async" width="2906" height="1730">Tue, 28 Apr 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringData Loss Prevention - Create and manage DLP detection entries outside of profileshttps://developers.cloudflare.com/changelog/post/2026-04-28-detection-entries-outside-profiles/https://developers.cloudflare.com/changelog/post/2026-04-28-detection-entries-outside-profiles/<p>You can now create, view, and manage DLP detection entries outside of profiles.</p> <p>Detection entries are no longer hidden inside individual profiles. Administrators can manage detection entries directly from the <strong>Detection entries</strong> section and use them in custom DLP profiles.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/">Configure detection entries</a>.</p>Tue, 28 Apr 2026 00:00:00 GMTData Loss PreventionData Loss PreventionData Loss Prevention - Detect PII records with a new predefined DLP profilehttps://developers.cloudflare.com/changelog/post/2026-04-28-pii-record-profile/https://developers.cloudflare.com/changelog/post/2026-04-28-pii-record-profile/<p>Cloudflare DLP now includes a new predefined profile designed to detect PII records that contain multiple types of personal data: <strong>Personally Identifiable Information (PII) Record</strong>.</p> <p>Most predefined and custom DLP profiles match when any enabled detection entry matches. The <strong>Personally Identifiable Information (PII) Record</strong> profile is different. It only matches when at least three unique detection entries are found in close proximity, which reduces false positives from standalone values that may not represent a real PII record.</p> <p>Detection entries included in the profile:</p> <ul> <li>AU Passport Number</li> <li>American Express Card Number</li> <li>Diners Club Card Number</li> <li>US Driver's License Number</li> <li>Email Address</li> <li>Full Name</li> <li>US Mailing Address</li> <li>Mastercard Card Number</li> <li>US Individual Tax Identification Number (ITIN)</li> <li>US Passport Number</li> <li>US Phone Number</li> <li>Union Pay Card Number</li> <li>United States SSN Numeric Detection</li> <li>Visa Card Number</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/">predefined DLP profiles</a>.</p>Tue, 28 Apr 2026 00:00:00 GMTData Loss PreventionData Loss PreventionDNS - Account-level enforce DNS-onlyhttps://developers.cloudflare.com/changelog/post/2026-04-28-enforce-dns-only/https://developers.cloudflare.com/changelog/post/2026-04-28-enforce-dns-only/ <p>You can now disable Cloudflare's reverse proxy across all zones in your account simultaneously using the new <code>enforce_dns_only</code> setting. When enabled, Cloudflare responds to DNS queries for all proxied records with your origin IP addresses instead of Cloudflare's anycast IPs. This account-level kill switch is designed for incident response scenarios where you need to quickly route traffic directly to your origin servers.</p> <aside role="note" aria-label="Caution" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-warning); --_t: var(--nb-warning-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:warning"><path fill="currentColor" d="M236.8 188.09L149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19a23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2a7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12a12 12 0 0 1 12 12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Caution</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Enabling this setting exposes your origin IP addresses and removes all Cloudflare protections — including DDoS mitigation, WAF, caching, and all other proxy-based features — for every zone in your account. Use with extreme caution and only after proper <a href="https://developers.cloudflare.com/dns/proxy-status/enforce-dns-only/#preparation">preparations</a>.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-characteristics">Key characteristics</h4><a class="anchor-link" href="#key-characteristics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Account-level</strong> — Affects all zones in the account simultaneously with a single API call.</li> <li><strong>Non-destructive</strong> — Does not modify your DNS records. Disabling the setting restores normal proxy behavior.</li> <li><strong>API-only</strong> — Available through the API only, not in the Cloudflare dashboard.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-affected">What's affected</h4><a class="anchor-link" href="#whats-affected"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Included:</strong> Standard proxied A, AAAA, and CNAME records, Load Balancing records, and records matching Worker routes.</p> <p><strong>Excluded:</strong> Spectrum applications, Cloudflare Tunnel CNAMEs, R2 custom domains, Web3 gateways, and Workers custom domains continue to operate normally.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-you-enable">Before you enable</h4><a class="anchor-link" href="#before-you-enable"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Verify your origin servers can handle direct traffic without Cloudflare's caching and filtering.</li> <li>Review which origin IPs will become publicly visible through DNS queries.</li> <li>Test the API in a staging account before relying on it for incident response.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available via API to all Cloudflare customers.</p> <p>For information on how to use it, refer to <a href="https://developers.cloudflare.com/dns/proxy-status/enforce-dns-only/">Enforce DNS-only developer documentation</a> .</p>Tue, 28 Apr 2026 00:00:00 GMTDNSDNSQueues - Realtime backlog metrics now available for Queueshttps://developers.cloudflare.com/changelog/post/2026-04-28-improved-queues-metrics/https://developers.cloudflare.com/changelog/post/2026-04-28-improved-queues-metrics/<p><a href="https://developers.cloudflare.com/queues/">Queues</a>, Cloudflare's managed message queue, now exposes realtime backlog metrics via the dashboard, REST API, and JavaScript API. Three new fields are available:</p> <ul> <li><strong><code>backlog_count</code></strong> — the number of unacknowledged messages in the queue</li> <li><strong><code>backlog_bytes</code></strong> — the total size of those messages in bytes</li> <li><strong><code>oldest_message_timestamp_ms</code></strong> — the timestamp of the oldest unacknowledged message</li> </ul> <p>The following endpoints also now include a <code>metadata.metrics</code> object on the result field after successful message consumption:</p> <ul> <li><code>/accounts/{account_id}/queues/{queue_id}/messages/pull</code></li> <li><code>/accounts/{account_id}/queues/{queue_id}/messages</code></li> <li><code>/accounts/{account_id}/queues/{queue_id}/messages/batch</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="javascript-apis">Javascript APIs</h4><a class="anchor-link" href="#javascript-apis"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Call <code>env.QUEUE.metrics()</code> to get realtime backlog metrics:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> backlogCount</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// number</span></span> <span class="line"><span class="nb-shiki-dzsirb"> backlogBytes</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// number</span></span> <span class="line"><span class="nb-shiki-dzsirb"> oldestMessageTimestamp</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Date | undefined</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">QUEUE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">metrics</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <p><code>env.QUEUE.send()</code> and <code>env.QUEUE.sendBatch()</code> also now return a metrics object on the response.</p> <p>You can also query these fields via the <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL Analytics API</a> or view realtime backlog on the <a href="https://dash.cloudflare.com/?to=/:account/workers/queues" target="_blank" rel="noopener">dashboard<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1402,height=494,format=webp/_astro/2026-04-28-queues-metrics.BYi0hgrD.png" alt="Queues realtime backlog" loading="lazy" decoding="async" width="1402" height="494"> <p>For more information, refer to <a href="https://developers.cloudflare.com/queues/observability/metrics/">Queues metrics</a>.</p>Tue, 28 Apr 2026 00:00:00 GMTQueuesQueuesSupport - Direct access to Support from the dashboardhttps://developers.cloudflare.com/changelog/post/2026-04-28-direct-support-navigation/https://developers.cloudflare.com/changelog/post/2026-04-28-direct-support-navigation/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="direct-access-to-support-from-the-dashboard">Direct access to Support from the dashboard</h4><a class="anchor-link" href="#direct-access-to-support-from-the-dashboard"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Support</strong> button in the dashboard global navigation header now takes you directly to the <a href="https://support.cloudflare.com" target="_blank" rel="noopener">Cloudflare Support Portal<span class="external-link"> ↗</span></a>, eliminating the previous dropdown menu.</p> <p>This change ensures that when you need help, you spend less time navigating the UI and more time getting the answers you need.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed?</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Previous behavior</strong>: Selecting <strong>? Support</strong> opened a dropdown menu with various links (Help Center, Cloudflare Community, etc.).</li> <li><strong>New behavior</strong>: Selecting <strong>Support</strong> immediately redirects your current tab to the Support Portal.</li> </ul> <p>To learn more about the resources available to you, refer to the <a href="https://developers.cloudflare.com/support/contacting-cloudflare-support/" target="_blank" rel="noopener">Cloudflare Support documentation<span class="external-link"> ↗</span></a>.</p>Tue, 28 Apr 2026 00:00:00 GMTSupportSupportCache - Cache Response Rules now support zone versioninghttps://developers.cloudflare.com/changelog/post/2026-04-27-cache-response-rules-zone-versioning/https://developers.cloudflare.com/changelog/post/2026-04-27-cache-response-rules-zone-versioning/<p>Cache Response Rules now work with <a href="https://developers.cloudflare.com/version-management/">Version Management</a>. You can version response-phase cache settings and promote them through environments, just like Cache Rules and other supported configurations.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously, Cache Response Rules were excluded from zone versioning. Any response-phase rule you created applied globally across all environments with no way to test changes in staging first. Cache Rules already supported versioning, but the response phase, where you modify <code>Cache-Control</code> directives, manage cache tags, and strip headers, did not.</p> <p>Cache Response Rules are now fully integrated with Version Management. You can create or modify response-phase rules within a version, and those changes stay scoped to that version until promoted.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Safe rollout of cache behavior changes</strong>: Test response-phase rules in a staging environment before promoting to production. Catch unintended caching side effects early.</li> <li><strong>Parity with Cache Rules</strong>: Cache Response Rules now follow the same versioning workflow as Cache Rules, so you can manage all cache configuration through a single promotion pipeline.</li> <li><strong>Independent environment control</strong>: Run different response-phase cache settings per environment. For example, strip <code>Set-Cookie</code> headers in staging to validate cacheability without affecting production traffic.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Configure Cache Response Rules in the <a href="https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> under <strong>Caching</strong> &gt; <strong>Cache Rules</strong>, or via the <a href="https://developers.cloudflare.com/ruleset-engine/rulesets-api/">Rulesets API</a>. For more details, refer to the <a href="https://developers.cloudflare.com/cache/how-to/cache-response-rules/">Cache Response Rules documentation</a> and the <a href="https://developers.cloudflare.com/version-management/">Version Management documentation</a>.</p>Mon, 27 Apr 2026 00:00:00 GMTCacheCacheCloudflare Fundamentals - Structured error responses for Cloudflare 5xx errorshttps://developers.cloudflare.com/changelog/post/2026-04-27-structured-responses-for-5xx-errors/https://developers.cloudflare.com/changelog/post/2026-04-27-structured-responses-for-5xx-errors/<p>Cloudflare-generated 5xx error responses now return structured JSON and Markdown when agents request them, matching the format already available for 1xxx errors. Responses follow <a href="https://www.rfc-editor.org/rfc/rfc9457" target="_blank" rel="noopener">RFC 9457 (Problem Details for HTTP APIs)<span class="external-link"> ↗</span></a> and include a <code>Retry-After</code> HTTP header on retryable codes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>5xx coverage.</strong> Ten Cloudflare-generated error codes (500, 502, 504, 520-526) now serve structured responses. These are errors Cloudflare itself generates when it cannot reach or understand the origin server. Origin-generated 5xx responses that Cloudflare passes through are not affected.</p> <p><strong>Fault attribution.</strong> The <code>error_category</code> field tells agents where the fault lies:</p> <ul> <li><code>origin</code> (502, 504, 520-524) — the origin server is responsible. Transient; retry with the backoff in <code>retry_after</code>.</li> <li><code>cloudflare</code> (500) — Cloudflare's fault, not the website or the request. Short retry.</li> <li><code>ssl</code> (525, 526) — the origin's TLS configuration is broken. Do not retry.</li> </ul> <p><strong>Retry-After header.</strong> Retryable codes (500, 502, 504, 520-524) include a <code>Retry-After</code> HTTP header matching the <code>retry_after</code> body field. Non-retryable codes (525, 526) do not include the header.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="negotiation-behavior">Negotiation behavior</h4><a class="anchor-link" href="#negotiation-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Request header sent</th> <th>Response format</th> </tr> </thead> <tbody> <tr> <td><code>Accept: application/json</code></td> <td>JSON (<code>application/json</code> content type)</td> </tr> <tr> <td><code>Accept: application/problem+json</code></td> <td>JSON (<code>application/problem+json</code> content type)</td> </tr> <tr> <td><code>Accept: application/json, text/markdown;q=0.9</code></td> <td>JSON</td> </tr> <tr> <td><code>Accept: text/markdown</code></td> <td>Markdown</td> </tr> <tr> <td><code>Accept: text/markdown, application/json</code></td> <td>Markdown (equal <code>q</code>, first-listed wins)</td> </tr> <tr> <td><code>Accept: */*</code></td> <td>HTML (default)</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available now for all zones on all plans.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Get JSON response for error 522:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -s</span><span class="nb-shiki-dzsirb"> --compressed</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: application/json"</span><span class="nb-shiki-dzsirb"> -A</span><span class="nb-shiki-mdbnqw"> "TestAgent/1.0"</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept-Encoding: gzip, deflate"</span><span class="nb-shiki-mdbnqw"> "&lt;YOUR_DOMAIN&gt;/cdn-cgi/error/522"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> jq</span><span class="nb-shiki-mdbnqw"> .</span></span></code></pre></figure> <p>Check presence of the <code>Retry-After</code> HTTP header associated with the JSON response for error 521:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -s</span><span class="nb-shiki-dzsirb"> --compressed</span><span class="nb-shiki-dzsirb"> -D</span><span class="nb-shiki-mdbnqw"> -</span><span class="nb-shiki-dzsirb"> -o</span><span class="nb-shiki-mdbnqw"> /dev/null</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: application/json"</span><span class="nb-shiki-dzsirb"> -A</span><span class="nb-shiki-mdbnqw"> "TestAgent/1.0"</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept-Encoding: gzip, deflate"</span><span class="nb-shiki-mdbnqw"> "&lt;YOUR_DOMAIN&gt;/cdn-cgi/error/521"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> grep</span><span class="nb-shiki-dzsirb"> -i</span><span class="nb-shiki-mdbnqw"> retry-after</span></span></code></pre></figure> <p>References:</p> <ul> <li><a href="https://www.rfc-editor.org/rfc/rfc9457" target="_blank" rel="noopener">RFC 9457 — Problem Details for HTTP APIs<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/">Cloudflare 5xx error documentation</a></li> </ul>Mon, 27 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare Fundamentals, Resource Tagging - Resource Tagging enters public betahttps://developers.cloudflare.com/changelog/post/2026-04-27-resource-tagging-public-beta/https://developers.cloudflare.com/changelog/post/2026-04-27-resource-tagging-public-beta/<p>Resource Tagging is now in public beta and rolling out to all Cloudflare accounts over the coming days. You can attach custom key-value metadata to your Cloudflare resources and query across your entire account to find what you need.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-included">What's included</h4><a class="anchor-link" href="#whats-included"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Broad resource type support</strong> — Tag zones, custom hostnames, Cloudflare Tunnels, Workers, D1 databases, R2 buckets, KV namespaces, Durable Object namespaces, Queues, Stream videos, Images, Access applications, Gateway rules, AI Gateways, and more. Refer to the <a href="https://developers.cloudflare.com/resource-tagging/reference/resource-types/">full list of supported resource types</a>.</li> <li><strong>Powerful filtering</strong> — Query tagged resources using AND/OR logic, negation, and key-only matching. Combine up to 20 filters per query to build precise resource views.</li> <li><strong>Account and zone-level endpoints</strong> — Full CRUD operations across both scopes.</li> <li><strong>Token-based authentication</strong> — Tagging supports <a href="https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/">Account Owned Tokens</a> that persist independently of individual users, so your automation keeps running through credential rotations and team changes.</li> <li><strong>Flexible role support</strong> — Super Administrators, Workers Admins, and Tag Admins can all manage tags.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-first-by-design">API-first by design</h4><a class="anchor-link" href="#api-first-by-design"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The API is the primary interface for Resource Tagging and the recommended path for all workflows — scripting tag assignments, building CI/CD pipelines, or integrating with your infrastructure-as-code toolchain.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dashboard-ui">Dashboard UI</h4><a class="anchor-link" href="#dashboard-ui"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can also view and manage tagged resources directly in the Cloudflare dashboard. Navigate to <strong>Manage Account</strong> &gt; <strong>Resource Tagging</strong> to see all tagged resources across your account, filter by resource name or tag, and add or edit tags inline.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2874,height=1234,format=webp/_astro/tagged-resources-dashboard.Dg5WvwiN.png" alt="Tagged Resources dashboard" loading="lazy" decoding="async" width="2874" height="1234"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-coming-next">What's coming next</h4><a class="anchor-link" href="#whats-coming-next"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In future releases, expect support for additional resource types across the Cloudflare platform, tag-based access control policies for scoping user permissions to tagged resources, billing and usage attribution by tag for breaking down costs by team, project, or environment, and Terraform provider support for managing tags declaratively.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="current-limitations">Current limitations</h4><a class="anchor-link" href="#current-limitations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>PUT</code> replaces all tags on a resource (no partial update). Use the <a href="https://developers.cloudflare.com/resource-tagging/how-to/manage-tags/#add-a-single-tag">GET, merge, PUT workflow</a> to modify individual tags safely.</li> <li><code>DELETE</code> removes all tags from a resource. To remove a single tag, PUT the remaining tags back.</li> <li>Querying tags for a resource that has never been tagged returns <code>500</code> instead of <code>404</code>. This is a known beta limitation.</li> </ul> <p>To get started, refer to the <a href="https://developers.cloudflare.com/resource-tagging/">Resource Tagging documentation</a>.</p>Mon, 27 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsResource TaggingSecurity Center - Unified workspace for Brand Protectionhttps://developers.cloudflare.com/changelog/post/2026-04-27-unified-workspace-brand-protection/https://developers.cloudflare.com/changelog/post/2026-04-27-unified-workspace-brand-protection/<p>We have introduced a unified investigation workspace within Brand Protection to help analysts manage complex brand portfolios. Instead of jumping between individual queries, you can now consolidate your workflow into a single, cohesive view.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>You can now elect multiple saved queries from your dashboard to generate a consolidated "Combined Matches" view. This allows you to triage results from different brand queries in one unified table</li> <li>You can open query extended views in distinct tabs within the Brand Protection dashboard. This enables you to maintain multiple investigation contexts simultaneously and switch between them without losing your place.</li> <li>You can reset your workspace using the new "Clear Selection" action, making it easier to pivot between different investigation sets.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Eliminate fragmented workflows by viewing all matches across different query buckets in a single table, reducing the need to click through dozens of individual query pages</li> <li>Correlate related campaigns by seeing similar domains or infrastructure patterns that appear across multiple saved queries</li> </ul> <p>Learn more in our <a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection documentation</a>.</p>Mon, 27 Apr 2026 00:00:00 GMTSecurity CenterSecurity CenterWAF - WAF Release - 2026-04-27https://developers.cloudflare.com/changelog/post/2026-04-27-waf-release/https://developers.cloudflare.com/changelog/post/2026-04-27-waf-release/ <p>This week's release focuses on new improvements to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <p><strong>Continuous Rule Improvements</strong></p> <p>We are continuously refining our managed rules to provide more resilient protection and deeper insights into attack patterns. To ensure an optimal security posture, we recommend consistently monitoring the Security Events dashboard and adjusting rule actions as these enhancements are deployed.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d866f980582748568385b94480cec1dd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...80cec1dd</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>PostgreSQL - SQLi - COPY - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "PostgreSQL - SQLi - COPY - Body (ID: <rule-id id="705a6b5569d5472596910e3ce7265a4e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e7265a4e</span></button></rule-id>). The rule previously known as "PostgreSQL - SQLi - COPY" is now renamed to "PostgreSQL - SQLi - COPY - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="71d133c374d94559aa9fdf042903de89"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2903de89</span></button></rule-id></td><td>N/A</td><td>PostgreSQL - SQLi - COPY - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9f1b1b7fd28a401b9d5c172d1036cfa6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1036cfa6</span></button></rule-id></td><td>N/A</td><td>PostgreSQL - SQLi - COPY - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8e40416659334b8ba789365755ff389e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...55ff389e</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR MAKE_SET/ELT - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - AND/OR MAKE_SET/ELT - Body" (ID: <rule-id id="0f41a593c8fe42c38a26f709252d3934"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...252d3934</span></button></rule-id>). The rule previously known as "SQLi - AND/OR MAKE_SET/ELT" is now renamed to "SQLi - AND/OR MAKE_SET/ELT - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1e0d4372ee1e41b9804b2d5c346487f9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...346487f9</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR MAKE_SET/ELT - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d2c961a164a64cf6b871c9511ac6ceca"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1ac6ceca</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR MAKE_SET/ELT - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4dacc0e6f32d4c5da3c2293edd471337"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dd471337</span></button></rule-id></td><td>N/A</td><td>SQLi - Common Patterns - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Common Patterns - Body" (ID: <rule-id id="98f746d07a6d48ab9dae669acb5d0b9b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cb5d0b9b</span></button></rule-id>). The rule previously known as "SQLi - Common Patterns" is now renamed to "SQLi - Common Patterns - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="53a374379f2e41e9934791c1975c07b7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...975c07b7</span></button></rule-id></td><td>N/A</td><td>SQLi - Common Patterns - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9efedebfc371443f9fe7308605b1b06b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...05b1b06b</span></button></rule-id></td><td>N/A</td><td>SQLi - Common Patterns - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d53a791496d64700870334f4dd0ba3c7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dd0ba3c7</span></button></rule-id></td><td>N/A</td><td>SQLi - Equation - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Equation - Body" (ID: <rule-id id="e7691e1e4f4d4769909f3df6c2eb3e7f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c2eb3e7f</span></button></rule-id>). The rule previously known as "SQLi - Equation" is now renamed to "SQLi - Equation - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="46efbd3496e64c3f902ad33d3d1c2384"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3d1c2384</span></button></rule-id></td><td>N/A</td><td>SQLi - Equation - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="46b937649a424b7ead90f6d0e1149ea6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e1149ea6</span></button></rule-id></td><td>N/A</td><td>SQLi - Equation - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="04d9182545f54ba8a4fa29fe205adbb0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...205adbb0</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR Digit Operator Digit - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - AND/OR Digit Operator Digit - Body" (ID: <rule-id id="762dd334ed0b4273816e3ff13893c564"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3893c564</span></button></rule-id>). The rule previously known as "SQLi - AND/OR Digit Operator Digit" is now renamed to "SQLi - AND/OR Digit Operator Digit - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a24e7c15503948bc8766481aad2abbaa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ad2abbaa</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR Digit Operator Digit - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0c55eb362df64f92a85aa46753acbc0d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...53acbc0d</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR Digit Operator Digit - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="18c9879b7e184c559d23c1652b45a97d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2b45a97d</span></button></rule-id></td><td>N/A</td><td>SQLi - Benchmark Function - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Benchmark Function - Body" (ID: <rule-id id="ac4e9ebfb43a4f3998f6072d2ebc44ad"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2ebc44ad</span></button></rule-id>). The rule previously known as "SQLi - Benchmark Function" is now renamed to "SQLi - Benchmark Function - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2adbc36c52324efcb4681b829889aadc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9889aadc</span></button></rule-id></td><td>N/A</td><td>SQLi - Benchmark Function - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="69564af3bc54406080deed72491b28e9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...491b28e9</span></button></rule-id></td><td>N/A</td><td>SQLi - Benchmark Function - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="94b1646f0b0b46ec9b96f7742aa649de"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2aa649de</span></button></rule-id></td><td>N/A</td><td>SQLi - Comparison - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Comparison - Body" (ID: <rule-id id="8166da327a614849bfa29317e7907480"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e7907480</span></button></rule-id>). The rule previously known as "SQLi - Comparison" is now renamed to "SQLi - Comparison - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="455ce87681bd4200bf53456c39e3e013"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...39e3e013</span></button></rule-id></td><td>N/A</td><td>SQLi - Comparison - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8152816062ed47f69be0f907f4bdb492"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f4bdb492</span></button></rule-id></td><td>N/A</td><td>SQLi - Comparison - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d5afd403a0544248b829fe5da1ff3b34"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a1ff3b34</span></button></rule-id></td><td>N/A</td><td>SQLi - String Concatenation - Body - Beta</td><td>Log</td><td>Block</td><td>This is a new detection. This rule is merged into the original rule "SQLi - String Concatenation - Headers" (ID: <rule-id id="3b0c61407d0b4f7d87e516472116d2fe"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2116d2fe</span></button></rule-id>).The rule previously known as "SQLi - String Concatenation - Headers" is now renamed to "SQLi - String Concatenation - Body". </td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cb0ec290ee454138abe18b750d0e6c3b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d0e6c3b</span></button></rule-id></td><td>N/A</td><td>SQLi - String Concatenation - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.(Former Id was <rule-id id="380099df2bb2469c91ebbb7b846d1940"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...846d1940</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c46d9097c9ef419aa4d9f10626cc211f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...26cc211f</span></button></rule-id></td><td>N/A</td><td>SQLi - String Concatenation - URI</td><td>Log</td><td>Block</td><td>This is a new detection. (Former Id was <rule-id id="bd19397228404b85aa3797238fae8c84"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8fae8c84</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6542d36980cf4018b4d5e2bfeacc78ab"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...eacc78ab</span></button></rule-id></td><td>N/A</td><td>SQLi - SELECT Expression - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - SELECT Expression - Body" (ID: <rule-id id="00da180570d34b5bae2121acd0023a36"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d0023a36</span></button></rule-id>). The rule previously known as "SQLi - SELECT Expression" is now renamed to "SQLi - SELECT Expression - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4073f7b575ff45dfb7621b43630bb223"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...630bb223</span></button></rule-id></td><td>N/A</td><td>SQLi - SELECT Expression - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2721e3184d50466ea637e9afdcd6efb5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dcd6efb5</span></button></rule-id></td><td>N/A</td><td>SQLi - SELECT Expression - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7ecca84c08aa4aad9b5a7bda18c47cea"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...18c47cea</span></button></rule-id></td><td>N/A</td><td>SQLi - ORD and ASCII - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - ORD and ASCII- Body" (ID: <rule-id id="2fc38b34a9d744d2a3cbcc41d0d207f9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d0d207f9</span></button></rule-id>). The rule previously known as "SQLi - ORD and ASCII" is now renamed to "SQLi - ORD and ASCII- Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f6d10e10c9514eb49dcc2122bdb1618f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bdb1618f</span></button></rule-id></td><td>N/A</td><td>SQLi - ORD and ASCII - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="60704f5c5513425c94cf77031d0906b6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1d0906b6</span></button></rule-id></td><td>N/A</td><td>SQLi - ORD and ASCII - Headers</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="700613b191d3479ea2782b4e9fe4eff5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9fe4eff5</span></button></rule-id></td><td>N/A</td><td>SQLi - Destructive Operations</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Mon, 27 Apr 2026 00:00:00 GMTWAFWAFGateway, Cloudflare One - Network Session Logs now available for all on-rampshttps://developers.cloudflare.com/changelog/post/2026-04-24-nsl-all-onramps/https://developers.cloudflare.com/changelog/post/2026-04-24-nsl-all-onramps/<p><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/">Zero Trust Network Session Logs</a> are now generated for all traffic proxied through Cloudflare Gateway, regardless of on-ramp type. This includes traffic from <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/">proxy endpoints (PAC files)</a> and <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">Browser Isolation</a> egress — on-ramps that previously did not generate session logs.</p> <p>Customers who already consume the <code>zero_trust_network_sessions</code> dataset via <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/">Logpush</a> or <a href="https://developers.cloudflare.com/log-explorer/">Log Explorer</a> may see increased log volume if they use these on-ramps.</p> <p>For field definitions, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/">Zero Trust Network Session Logs</a>. For traffic analysis, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/">Network session analytics</a>.</p>Fri, 24 Apr 2026 00:00:00 GMTGatewayGatewayCloudflare OneTerraform - Terraform v5.19.0 now availablehttps://developers.cloudflare.com/changelog/post/2026-04-24-terraform-v5.19.0-provider/https://developers.cloudflare.com/changelog/post/2026-04-24-terraform-v5.19.0-provider/<p>Terraform Provider v5.19.0 introduces 14 new resources spanning AI Gateway, Pipelines, R2 Data Catalog, User Groups, Vulnerability Scanner, Workers Observability, and Zero Trust capabilities. This release significantly improves the v4 to v5 migration experience with automatic state upgraders for 26 resources, working seamlessly with the new <a href="https://github.com/cloudflare/tf-migrate" target="_blank" rel="noopener">tf-migrate CLI tool<span class="external-link"> ↗</span></a> to automate resource renames, attribute updates, and <code>moved</code> block generation. Together, these enhancements reduce manual migration effort and minimize risk when upgrading from v4 to v5.</p> <p><strong>Note:</strong> <code>cmd/migrate</code> is deprecated in favor of <code>tf-migrate</code> and will be removed in a future release (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/pull/7062" target="_blank" rel="noopener">#7062<span class="external-link"> ↗</span></a>)</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-resources">New Resources</h4><a class="anchor-link" href="#new-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>cloudflare_ai_gateway</strong>: Manage AI Gateway instances</li> <li><strong>cloudflare_certificate_authorities_hostname_associations</strong>: Manage mTLS certificate hostname associations</li> <li><strong>cloudflare_custom_page_asset</strong>: Manage custom page assets</li> <li><strong>cloudflare_pipeline</strong>: Manage Cloudflare Pipelines</li> <li><strong>cloudflare_r2_data_catalog</strong>: Manage R2 Data Catalog</li> <li><strong>cloudflare_user_group</strong>: Manage user groups</li> <li><strong>cloudflare_user_group_members</strong>: Manage user group memberships</li> <li><strong>cloudflare_vulnerability_scanner_credential</strong>: Manage vulnerability scanner credentials</li> <li><strong>cloudflare_vulnerability_scanner_credential_set</strong>: Manage vulnerability scanner credential sets</li> <li><strong>cloudflare_vulnerability_scanner_target_environment</strong>: Manage vulnerability scanner target environments</li> <li><strong>cloudflare_workers_observability_destination</strong>: Manage Workers Observability destinations</li> <li><strong>cloudflare_zero_trust_device_ip_profile</strong>: Manage Zero Trust device IP profiles</li> <li><strong>cloudflare_zero_trust_device_subnet</strong>: Manage Zero Trust device subnets</li> <li><strong>cloudflare_zero_trust_dlp_settings</strong>: Manage Zero Trust DLP settings</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="v4-to-v5-migration-state-upgraders">V4 to V5 Migration State Upgraders</h4><a class="anchor-link" href="#v4-to-v5-migration-state-upgraders"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>State upgraders added for seamless migration from v4 to v5 for the following resources:</p> <ul> <li>account</li> <li>account_member</li> <li>account_token</li> <li>authenticated_origin_pulls</li> <li>authenticated_origin_pulls_hostname_certificate</li> <li>byo_ip_prefix</li> <li>custom_hostname</li> <li>custom_ssl</li> <li>leaked_credential_check</li> <li>leaked_credential_check_rule</li> <li>logpush_ownership_challenge</li> <li>mtls_certificate</li> <li>observatory_scheduled_test</li> <li>pages_domain</li> <li>regional_tiered_cache</li> <li>turnstile_widget</li> <li>workers_custom_domain</li> <li>zero_trust_device_custom_profile</li> <li>zero_trust_device_default_profile</li> <li>zero_trust_device_posture_integration</li> <li>zero_trust_gateway_certificate</li> <li>zero_trust_gateway_settings</li> <li>zero_trust_organization</li> <li>zero_trust_tunnel_cloudflared_virtual_network</li> <li>zone_setting</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-features">Other Features</h4><a class="anchor-link" href="#other-features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>ruleset</strong>: Add <code>content_converter</code> and <code>redirects_for_ai_training</code> support to configuration rules</li> <li><strong>zero_trust_gateway_logging</strong>: Make importable</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="migration--state-management">Migration &amp; State Management</h4><a class="anchor-link" href="#migration--state-management"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_member</strong>: Add UseStateForUnknown to status field to prevent drift</li> <li><strong>authenticated_origin_pulls_settings</strong>: Fix no prior schema and no-op upgrade</li> <li><strong>certificate_pack</strong>: Initialize empty lists instead of null in state upgrader to prevent drift</li> <li><strong>migrations</strong>: Handle ambiguous schema_version state for v4/v5 coexistence</li> <li><strong>zero_trust_access_policy</strong>: Fix nil pointer panic in state upgrader; set PriorSchema nil for v4 state upgrade</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resource-specific-fixes">Resource-Specific Fixes</h4><a class="anchor-link" href="#resource-specific-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>ai_search_instance</strong>: Restore original defaults for cache and cache_threshold; conflict resolution</li> <li><strong>apijson</strong>: Return empty object from MarshalForPatch when no fields are serializable</li> <li><strong>dlp_predefined_profile</strong>: Eliminate perpetual entries and enabled_entries drift</li> <li><strong>dns_record</strong>: Avoid unnecessary drift for ipv4_only and ipv6_only attributes; remove private_routing default value</li> <li><strong>drift</strong>: Preserve prior state values for optional fields not returned by API</li> <li><strong>healthcheck</strong>: Use buildHealthcheckPlanChecks helper for correct plan checks per migration source; update assertions</li> <li><strong>leaked_credential_check_rule</strong>: Handle empty ID from v4 provider state migration</li> <li><strong>list_item</strong>: Remove context</li> <li><strong>logpush_job</strong>: Update model for migration</li> <li><strong>ruleset</strong>: Fix migration; add redirects_for_ai_training to SourceV4ActionParametersModel; fix duplicate model attribute</li> <li><strong>worker</strong>: Add UseStateForUnknown() plan modifiers and update tests for observability.traces</li> <li><strong>workers_custom_domain</strong>: Handle HTTP 200 no content header; update assertions</li> <li><strong>workers_script</strong>: Fix model drift</li> <li><strong>zero_trust_access_identity_provider</strong>: Fix boolean drifts</li> <li><strong>zero_trust_device_managed_networks</strong>: Upgrade resource state</li> <li><strong>zero_trust_gateway_policy</strong>: Make filters Computed+Optional to prevent drift</li> <li><strong>zero_trust_gateway_settings</strong>: Fix breaking changes; implement sweeper to reset account to clean defaults</li> <li><strong>zone_setting</strong>: Migration test improvements and fixes</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="documentation">Documentation</h4><a class="anchor-link" href="#documentation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>healthcheck</strong>: Update port description to clarify defaults</li> <li>Add application-scoped access policy migration guidance</li> <li>Update zone_settings_override migration guide for tf-migrate v2 workflow</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration" target="_blank" rel="noopener">Version 5 Migration Guide<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Fri, 24 Apr 2026 00:00:00 GMTTerraformTerraformTerraform - Automate migration from Cloudflare's Terraform v4 to v5 providerhttps://developers.cloudflare.com/changelog/post/2026-04-24-tf-migrate-tool-released/https://developers.cloudflare.com/changelog/post/2026-04-24-tf-migrate-tool-released/<p>We're excited to announce <strong>tf-migrate</strong>, a purpose-built CLI tool that simplifies migrating from Cloudflare Terraform Provider v4 to v5.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="v5-is-stable-and-ready-for-production">v5 is stable and ready for production</h4><a class="anchor-link" href="#v5-is-stable-and-ready-for-production"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Terraform Provider v5 is stable and actively receiving updates.</strong> We encourage all users to migrate to v5 to take advantage of ongoing enhancements and new capabilities.</p> <p>Cloudflare uses tf-migrate to migrate our own infrastructure — the same tool we're providing to the community — ensuring the best possible migration experience.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-tf-migrate-does">What tf-migrate does</h4><a class="anchor-link" href="#what-tf-migrate-does"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>tf-migrate</strong> automates the tedious and error-prone parts of the v4 to v5 migration process:</p> <ul> <li><strong>Resource type renames</strong> – Automatically updates <code>cloudflare_record</code> → <code>cloudflare_dns_record</code>, <code>cloudflare_access_application</code> → <code>cloudflare_zero_trust_access_application</code>, and 40+ other renamed resources</li> <li><strong>Attribute transformations</strong> – Updates field names (e.g., <code>value</code> → <code>content</code> for DNS records) and restructures nested blocks</li> <li><strong>Moved block generation</strong> – Creates Terraform 1.8+ <code>moved</code> blocks to prevent resource replacements and ensure zero-downtime migrations</li> <li><strong>Cross-file reference updates</strong> – Automatically finds and updates all references to renamed resources across your entire configuration</li> <li><strong>Dry-run mode</strong> – Preview all changes before applying them to ensure safety</li> </ul> <p>Combined with the automatic state upgraders introduced in v5.19+, tf-migrate eliminates the manual work and risk that previously made v5 migrations challenging. Tf-migrate operates directly on the config, and the built-in state upgraders handle the rest.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="supported-resources">Supported resources</h4><a class="anchor-link" href="#supported-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Tf-migrate currently supports the most common Terraform resources our customers use. We are actively working to expand coverage, with the most commonly used resources prioritized first.</p> <p>For the complete list of supported resources and their migration status, refer to the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">v5 Stabilization Tracker<span class="external-link"> ↗</span></a>. This list is updated regularly as additional resources are stabilized and migration support is added.</p> <p>Resources not yet supported by tf-migrate will need to be migrated manually using the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">version 5 upgrade guide<span class="external-link"> ↗</span></a>. The upgrade guide provides step-by-step instructions for handling resource renames, attribute changes, and state migrations.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/tf-migrate/releases" target="_blank" rel="noopener">Download tf-migrate<span class="external-link"> ↗</span></a></li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration" target="_blank" rel="noopener">Version 5 Migration Guide<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/" target="_blank" rel="noopener">Terraform Provider documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">v5 Stabilization Tracker<span class="external-link"> ↗</span></a></li> </ul> <p>We have been releasing Betas over the past month and a half while testing this tool. See the full changelog of those Betas here: <a href="https://github.com/cloudflare/tf-migrate/releases" target="_blank" rel="noopener">tf-migrate releases<span class="external-link"> ↗</span></a>.</p>Fri, 24 Apr 2026 00:00:00 GMTTerraformTerraformAccess - AAGUID restrictions and AMR matching for Access independent MFAhttps://developers.cloudflare.com/changelog/post/2026-04-23-independent-mfa-aaguid-amr/https://developers.cloudflare.com/changelog/post/2026-04-23-independent-mfa-aaguid-amr/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/">Independent MFA</a> in Cloudflare Access now supports two additional organization-level controls:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#restrict-authenticators-by-aaguid">Restrict authenticators by AAGUID</a></strong> — Limit enrollment to a specific set of WebAuthn authenticators using their <a href="https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-registry-v2.0-id-20180227.html#authenticator-attestation-guid" target="_blank" rel="noopener">AAGUID<span class="external-link"> ↗</span></a>. This is useful for organizations that require FIPS-validated security keys or company-issued hardware. AAGUIDs are managed through a new <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/lists/">List</a> type.</li> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#use-identity-provider-mfa">AMR matching</a></strong> — Skip the independent MFA prompt when the identity provider has already performed an equivalent MFA. Access reads the <code>amr</code> claim defined in <a href="https://datatracker.ietf.org/doc/html/rfc8176" target="_blank" rel="noopener">RFC 8176<span class="external-link"> ↗</span></a> and matches supported values such as <code>hwk</code>, <code>otp</code>, and <code>fpt</code> to the authenticator types allowed on the application or policy. This prevents users from having to complete MFA twice when their identity provider already enforces it.</li> </ul> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/">Independent MFA</a>.</p>Thu, 23 Apr 2026 00:00:00 GMTAccessAccessAudit Logs - Audit Logs v2 — Organization-level supporthttps://developers.cloudflare.com/changelog/post/2026-04-23-audit-logs-v2-organization-level/https://developers.cloudflare.com/changelog/post/2026-04-23-audit-logs-v2-organization-level/<p>Audit Logs v2 now supports organization-level audit logs. Org Admins can retrieve audit events for actions performed at the organization level via the Audit Logs v2 API.</p> <p>To retrieve organization-level audit logs, use the following endpoint:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">GET</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/organizations/{organization_id}/logs/audit</span></span></code></pre></figure> <p>This release covers user-initiated actions performed through organization-level APIs. Audit logs for system-initiated actions, a dashboard UI, and Logpush support for organizations will be added in future releases.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Organization-level audit logs are separate from account-level audit logs. Actions performed within a specific account continue to be available via the account-level Audit Logs UI, Audit Logs v2 API, and Logpush.</p></div></div></aside> <p>For more information, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs documentation</a>.</p>Thu, 23 Apr 2026 00:00:00 GMTAudit LogsAudit LogsSDK, Go SDK - Go SDK v6.10.0 Releasedhttps://developers.cloudflare.com/changelog/post/2026-04-23-go-sdk-v6.10.0/https://developers.cloudflare.com/changelog/post/2026-04-23-go-sdk-v6.10.0/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="v6100">v6.10.0</h4><a class="anchor-link" href="#v6100"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In this release, you'll see a number of breaking changes. This is primarily due to changes in OpenAPI definitions, which our libraries are based off of, and codegen updates that we rely on to read those OpenAPI definitions and produce our SDK libraries.</p> <p><strong>Please ensure you read through the list of changes below before moving to this version</strong> - this will help you understand any down or upstream issues it may cause to your environments.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>See the <a href="https://github.com/cloudflare/cloudflare-go/blob/main/MIGRATION_GUIDE.md" target="_blank" rel="noopener">v6.10.0 Migration Guide<span class="external-link"> ↗</span></a> for before/after code examples and actions needed for each change.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="abuse-reports---registrar-whois-report-field-removals">Abuse Reports - Registrar WHOIS Report Field Removals</h4><a class="anchor-link" href="#abuse-reports---registrar-whois-report-field-removals"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Several fields have been removed from <code>AbuseReportNewParamsBodyAbuseReportsRegistrarWhoisReportRegWhoRequest</code>:</p> <ul> <li><code>RegWhoGoodFaithAffirmation</code></li> <li><code>RegWhoLawfulProcessingAgreement</code></li> <li><code>RegWhoLegalBasis</code></li> <li><code>RegWhoRequestType</code></li> <li><code>RegWhoRequestedDataElements</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search---instance-params-restructured">AI Search - Instance Params Restructured</h4><a class="anchor-link" href="#ai-search---instance-params-restructured"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>InstanceNewParams</code> and <code>InstanceUpdateParams</code> types have been significantly restructured. Many fields have been moved or removed:</p> <ul> <li><code>InstanceNewParams.TokenID</code>, <code>Type</code>, <code>CreatedFromAISearchWizard</code>, <code>WorkerDomain</code> removed</li> <li><code>InstanceUpdateParams</code> — most configuration fields removed (including <code>IndexMethod</code>, <code>IndexingOptions</code>, <code>MaxNumResults</code>, <code>Metadata</code>, <code>Paused</code>, <code>PublicEndpointParams</code>, <code>Reranking</code>, <code>RerankingModel</code>, <code>RetrievalOptions</code>, <code>RewriteModel</code>, <code>RewriteQuery</code>, <code>ScoreThreshold</code>, <code>SourceParams</code>, <code>Summarization</code>, <code>SummarizationModel</code>, <code>SystemPromptAISearch</code>, <code>SystemPromptIndexSummarization</code>, <code>SystemPromptRewriteQuery</code>, <code>TokenID</code>, <code>CreatedFromAISearchWizard</code>, <code>WorkerDomain</code>)</li> <li><code>InstanceSearchParams.Messages</code> field removed along with <code>InstanceSearchParamsMessage</code> and <code>InstanceSearchParamsMessagesRole</code> types</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search---instanceitem-service-removed">AI Search - InstanceItem Service Removed</h4><a class="anchor-link" href="#ai-search---instanceitem-service-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>InstanceItemService</code> type has been removed. The items sub-resource at <code>client.AISearch.Instances.Items</code> no longer exists in the non-namespace path. Use <code>client.AISearch.Namespaces.Instances.Items</code> instead.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search---token-types-removed">AI Search - Token Types Removed</h4><a class="anchor-link" href="#ai-search---token-types-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following types have been removed from the <code>ai_search</code> package:</p> <ul> <li><code>TokenDeleteResponse</code></li> <li><code>TokenListParams</code> (and associated <code>TokenListParamsOrderBy</code>, <code>TokenListParamsOrderByDirection</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security---investigate-move-return-type-change">Email Security - Investigate Move Return Type Change</h4><a class="anchor-link" href="#email-security---investigate-move-return-type-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>Investigate.Move.New()</code> method now returns a raw slice instead of a paginated wrapper:</p> <ul> <li><code>New()</code> returns <code>*[]InvestigateMoveNewResponse</code> instead of <code>*pagination.SinglePage[InvestigateMoveNewResponse]</code></li> <li><code>NewAutoPaging()</code> method removed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="hyperdrive---config-params-restructured">Hyperdrive - Config Params Restructured</h4><a class="anchor-link" href="#hyperdrive---config-params-restructured"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>ConfigEditParams</code> type lost its <code>MTLS</code> and <code>Name</code> fields. The <code>HyperdriveMTLSParam</code> type lost <code>MTLS</code> and <code>Host</code> fields. The <code>Host</code> field on origin config changed from <code>param.Field[string]</code> to a plain <code>string</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="iam---usergroupmember-params-and-return-types-changed">IAM - UserGroupMember Params and Return Types Changed</h4><a class="anchor-link" href="#iam---usergroupmember-params-and-return-types-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>UserGroupMemberNewParams</code> struct has been restructured and the <code>New()</code> method now returns a paginated response:</p> <ul> <li><code>UserGroupMemberNewParams.Body</code> renamed to <code>UserGroupMemberNewParams.Members</code></li> <li><code>UserGroupMemberNewParamsBody</code> renamed to <code>UserGroupMemberNewParamsMember</code></li> <li><code>UserGroupMemberUpdateParams.Body</code> renamed to <code>UserGroupMemberUpdateParams.Members</code></li> <li><code>UserGroupMemberUpdateParamsBody</code> renamed to <code>UserGroupMemberUpdateParamsMember</code></li> <li><code>UserGroups.Members.New()</code> returns <code>*pagination.SinglePage[UserGroupMemberNewResponse]</code> instead of <code>*UserGroupMemberNewResponse</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="iam---usergroup-list-direction-type-changed">IAM - UserGroup List Direction Type Changed</h4><a class="anchor-link" href="#iam---usergroup-list-direction-type-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>UserGroupListParams.Direction</code> field changed from <code>param.Field[string]</code> to <code>param.Field[UserGroupListParamsDirection]</code> (typed enum with <code>asc</code>/<code>desc</code> values).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pipelines---delete-methods-now-return-typed-responses">Pipelines - Delete Methods Now Return Typed Responses</h4><a class="anchor-link" href="#pipelines---delete-methods-now-return-typed-responses"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Several delete methods across Pipelines now return typed responses instead of bare error:</p> <ul> <li><code>Pipelines.DeleteV1()</code> returns <code>(*PipelineDeleteV1Response, error)</code> instead of <code>error</code></li> <li><code>Pipelines.Sinks.Delete()</code> returns <code>(*SinkDeleteResponse, error)</code> instead of <code>error</code></li> <li><code>Pipelines.Streams.Delete()</code> returns <code>(*StreamDeleteResponse, error)</code> instead of <code>error</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="queues---message-response-types-removed">Queues - Message Response Types Removed</h4><a class="anchor-link" href="#queues---message-response-types-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following response envelope types have been removed:</p> <ul> <li><code>MessageBulkPushResponseSuccess</code></li> <li><code>MessagePushResponseSuccess</code></li> <li><code>MessageAckResponse</code> fields <code>RetryCount</code> and <code>Warnings</code> removed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="secrets-store---pagination-wrapper-removal-and-type-changes">Secrets Store - Pagination Wrapper Removal and Type Changes</h4><a class="anchor-link" href="#secrets-store---pagination-wrapper-removal-and-type-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Methods now return direct types instead of <code>SinglePage</code> wrappers, and several internal types have been removed. Associated <code>AutoPaging</code> methods have also been removed:</p> <ul> <li><code>Stores.New()</code> returns <code>*StoreNewResponse</code> instead of <code>*pagination.SinglePage[StoreNewResponse]</code></li> <li><code>Stores.NewAutoPaging()</code> method removed</li> <li><code>Stores.Secrets.BulkDelete()</code> returns <code>*StoreSecretBulkDeleteResponse</code> instead of <code>*pagination.SinglePage[StoreSecretBulkDeleteResponse]</code></li> <li><code>Stores.Secrets.BulkDeleteAutoPaging()</code> method removed</li> <li>Removed types: <code>StoreDeleteResponse</code>, <code>StoreDeleteResponseEnvelopeResultInfo</code>, <code>StoreSecretDeleteResponse</code>, <code>StoreSecretDeleteResponseStatus</code>, <code>StoreSecretBulkDeleteResponse</code> (old shape), <code>StoreSecretBulkDeleteResponseStatus</code>, <code>StoreSecretDeleteResponseEnvelopeResultInfo</code></li> <li><code>StoreNewParams</code> restructured (old <code>StoreNewParamsBody</code> removed)</li> <li><code>StoreSecretBulkDeleteParams</code> restructured</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="stream---audiotracks-return-type-change">Stream - AudioTracks Return Type Change</h4><a class="anchor-link" href="#stream---audiotracks-return-type-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>AudioTracks.Get()</code> method now returns a dedicated response type instead of a paginated list. The <code>GetAutoPaging()</code> method has been removed:</p> <ul> <li><code>Get()</code> returns <code>*AudioTrackGetResponse</code> instead of <code>*pagination.SinglePage[Audio]</code></li> <li><code>GetAutoPaging()</code> method removed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="stream---clip-type-removal-and-return-type-change">Stream - Clip Type Removal and Return Type Change</h4><a class="anchor-link" href="#stream---clip-type-removal-and-return-type-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>Clip.New()</code> method now returns the shared <code>Video</code> type. The following types have been entirely removed:</p> <ul> <li><code>Clip</code>, <code>ClipPlayback</code>, <code>ClipStatus</code>, <code>ClipWatermark</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="stream---copy-and-clip-params-field-removals">Stream - Copy and Clip Params Field Removals</h4><a class="anchor-link" href="#stream---copy-and-clip-params-field-removals"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ClipNewParams.MaxDurationSeconds</code>, <code>ThumbnailTimestampPct</code>, <code>Watermark</code> removed</li> <li><code>CopyNewParams.ThumbnailTimestampPct</code>, <code>Watermark</code> removed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="stream---download-and-webhook-changes">Stream - Download and Webhook Changes</h4><a class="anchor-link" href="#stream---download-and-webhook-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>DownloadNewResponseStatus</code> type removed</li> <li><code>WebhookUpdateResponse</code> and <code>WebhookGetResponse</code> changed from <code>interface{}</code> type aliases to full struct types</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust---access-ai-control-mcp-portal-union-types-removed">Zero Trust - Access AI Control MCP Portal Union Types Removed</h4><a class="anchor-link" href="#zero-trust---access-ai-control-mcp-portal-union-types-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following union interface types have been removed:</p> <ul> <li><code>AccessAIControlMcpPortalListResponseServersUpdatedPromptsUnion</code></li> <li><code>AccessAIControlMcpPortalListResponseServersUpdatedToolsUnion</code></li> <li><code>AccessAIControlMcpPortalReadResponseServersUpdatedPromptsUnion</code></li> <li><code>AccessAIControlMcpPortalReadResponseServersUpdatedToolsUnion</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="vulnerability-scanner-clientvulnerabilityscanner">Vulnerability Scanner (<code>client.VulnerabilityScanner</code>)</h4><a class="anchor-link" href="#vulnerability-scanner-clientvulnerabilityscanner"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> Full vulnerability scanning management</p> <ul> <li><strong>CredentialSets</strong> - CRUD for credential sets (<code>New</code>, <code>Update</code>, <code>List</code>, <code>Delete</code>, <code>Edit</code>, <code>Get</code>)</li> <li><strong>Credentials</strong> - Manage credentials within sets (<code>New</code>, <code>Update</code>, <code>List</code>, <code>Delete</code>, <code>Edit</code>, <code>Get</code>)</li> <li><strong>Scans</strong> - Create and manage vulnerability scans (<code>New</code>, <code>List</code>, <code>Get</code>)</li> <li><strong>TargetEnvironments</strong> - Manage scan target environments (<code>New</code>, <code>Update</code>, <code>List</code>, <code>Delete</code>, <code>Edit</code>, <code>Get</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search---namespaces-clientaisearchnamespaces">AI Search - Namespaces (<code>client.AISearch.Namespaces</code>)</h4><a class="anchor-link" href="#ai-search---namespaces-clientaisearchnamespaces"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> Namespace-scoped AI Search management</p> <ul> <li><code>New()</code>, <code>Update()</code>, <code>List()</code>, <code>Delete()</code>, <code>ChatCompletions()</code>, <code>Read()</code>, <code>Search()</code></li> <li><strong>Instances</strong> - Namespace-scoped instances (<code>New</code>, <code>Update</code>, <code>List</code>, <code>Delete</code>, <code>ChatCompletions</code>, <code>Read</code>, <code>Search</code>, <code>Stats</code>)</li> <li><strong>Jobs</strong> - Instance job management (<code>New</code>, <code>Update</code>, <code>List</code>, <code>Get</code>, <code>Logs</code>)</li> <li><strong>Items</strong> - Instance item management (<code>List</code>, <code>Delete</code>, <code>Chunks</code>, <code>NewOrUpdate</code>, <code>Download</code>, <code>Get</code>, <code>Logs</code>, <code>Sync</code>, <code>Upload</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="browser-rendering---devtools-clientbrowserrenderingdevtools">Browser Rendering - Devtools (<code>client.BrowserRendering.Devtools</code>)</h4><a class="anchor-link" href="#browser-rendering---devtools-clientbrowserrenderingdevtools"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> DevTools protocol browser control</p> <ul> <li><strong>Session</strong> - List and get devtools sessions</li> <li><strong>Browser</strong> - Browser lifecycle management (<code>New</code>, <code>Delete</code>, <code>Connect</code>, <code>Launch</code>, <code>Protocol</code>, <code>Version</code>)</li> <li><strong>Page</strong> - Get page by target ID</li> <li><strong>Targets</strong> - Manage browser targets (<code>New</code>, <code>List</code>, <code>Activate</code>, <code>Get</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="registrar-clientregistrar">Registrar (<code>client.Registrar</code>)</h4><a class="anchor-link" href="#registrar-clientregistrar"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW:</strong> Domain check and search endpoints</p> <ul> <li><code>Check()</code> - <code>POST /accounts/{account_id}/registrar/domain-check</code></li> <li><code>Search()</code> - <code>GET /accounts/{account_id}/registrar/domain-search</code></li> </ul> <p><strong>NEW:</strong> Registration management (<code>client.Registrar.Registrations</code>)</p> <ul> <li><code>New()</code>, <code>List()</code>, <code>Edit()</code>, <code>Get()</code></li> <li><code>RegistrationStatus.Get()</code> - Get registration workflow status</li> <li><code>UpdateStatus.Get()</code> - Get update workflow status</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cache---origin-cloud-regions-clientcacheorigincloudregions">Cache - Origin Cloud Regions (<code>client.Cache.OriginCloudRegions</code>)</h4><a class="anchor-link" href="#cache---origin-cloud-regions-clientcacheorigincloudregions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> Manage origin cloud region configurations</p> <ul> <li><code>New()</code>, <code>List()</code>, <code>Delete()</code>, <code>BulkDelete()</code>, <code>BulkEdit()</code>, <code>Edit()</code>, <code>Get()</code>, <code>SupportedRegions()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust---dlp-settings-clientzerotrustdlpsettings">Zero Trust - DLP Settings (<code>client.ZeroTrust.DLP.Settings</code>)</h4><a class="anchor-link" href="#zero-trust---dlp-settings-clientzerotrustdlpsettings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>NEW SERVICE:</strong> DLP settings management</p> <ul> <li><code>Update()</code>, <code>Delete()</code>, <code>Edit()</code>, <code>Get()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="radar">Radar</h4><a class="anchor-link" href="#radar"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>AgentReadiness.Summary()</code> - Agent readiness summary by dimension</li> <li><code>AI.MarkdownForAgents.Summary()</code> - Markdown-for-agents summary</li> <li><code>AI.MarkdownForAgents.Timeseries()</code> - Markdown-for-agents timeseries</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="iam-clientiam">IAM (<code>client.IAM</code>)</h4><a class="anchor-link" href="#iam-clientiam"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>UserGroups.Members.Get()</code> - Get details of a specific member in a user group</li> <li><code>UserGroups.Members.NewAutoPaging()</code> - Auto-paging variant for adding members</li> <li><code>UserGroups.NewParams.Policies</code> changed from required to optional</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bot-management">Bot Management</h4><a class="anchor-link" href="#bot-management"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ContentBotsProtection</code> field added to <code>BotFightModeConfiguration</code> and <code>SubscriptionConfiguration</code> (<code>block</code>/<code>disabled</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations">Deprecations</h4><a class="anchor-link" href="#deprecations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>None in this release.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/cloudflare-go/releases/tag/v6.10.0" target="_blank" rel="noopener">Download Go SDK v6.10.0<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/api/sdks/go/" target="_blank" rel="noopener">Go SDK documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/cloudflare-go/blob/main/MIGRATION_GUIDE.md" target="_blank" rel="noopener">Migration Guide<span class="external-link"> ↗</span></a></li> </ul>Thu, 23 Apr 2026 00:00:00 GMTSDKSDKGo SDKAnalytics, Log Explorer - Custom dashboards available to all customershttps://developers.cloudflare.com/changelog/post/2026-04-22-custom-dashboards-ga/https://developers.cloudflare.com/changelog/post/2026-04-22-custom-dashboards-ga/<p>Custom Dashboards are now available to all Cloudflare customers. Build personalized views that highlight the metrics most critical to your infrastructure and security posture, moving beyond standard product dashboards.</p> <p>This update significantly expands the data available for visualization. Build charts based on any of the <strong>100+ datasets</strong> available via the Cloudflare GraphQL API, covering everything from WAF events and Workers metrics to Load Balancing and Zero Trust logs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="log-explorer-integration">Log Explorer integration</h4><a class="anchor-link" href="#log-explorer-integration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For Log Explorer customers, you can now turn raw log queries directly into dashboard charts. When you identify a specific pattern or spike while investigating logs, save that query as a visualization to monitor those signals in real-time without leaving the dashboard.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Unified visibility</strong>: Consolidate signals from different Cloudflare products (for example, HTTP Traffic and R2 Storage) into a single view.</li> <li><strong>Flexible monitoring</strong>: Create charts that focus on specific status codes, ASN regions, or security actions that matter to your business.</li> <li><strong>Expanded limits</strong>: Log Explorer customers can create up to <strong>100 dashboards</strong> (up from 25 for standard customers).</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1079,height=793,format=webp/_astro/customdashboardshome.BIpSvImM.jpg" alt="Custom Dashboards home page showing dashboard list and chart previews" loading="lazy" decoding="async" width="1079" height="793"> <p>To get started, refer to the <a href="https://developers.cloudflare.com/analytics/custom-dashboards/">Custom Dashboards documentation</a>.</p>Wed, 22 Apr 2026 00:00:00 GMTAnalyticsAnalyticsLog ExplorerR2, R2 Data Catalog - R2 Data Catalog snapshot expiration now removes unreferenced data fileshttps://developers.cloudflare.com/changelog/post/2026-04-22-snapshot-expiration-cleans-data-files/https://developers.cloudflare.com/changelog/post/2026-04-22-snapshot-expiration-cleans-data-files/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>, a managed <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> catalog built into R2, now removes unreferenced data files during automatic snapshot expiration. This improvement reduces storage costs and eliminates the need to run manual maintenance jobs to reclaim space from deleted data.</p> <p>Previously, snapshot expiration only cleaned up Iceberg metadata files such as manifests and manifest lists. Data files that were no longer referenced by active snapshots remained in R2 storage until you manually ran <code>remove_orphan_files</code> or <code>expire_snapshots</code> through an engine like Spark. This required extra operational overhead and left stale data files consuming storage.</p> <p>Snapshot expiration now handles both metadata and data file cleanup automatically. When a snapshot is expired, any data files that are no longer referenced by retained snapshots are removed from R2 storage.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Enable catalog-level snapshot expiration</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> catalog</span><span class="nb-shiki-mdbnqw"> snapshot-expiration</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-mdbnqw"> my-bucket</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --older-than-days</span><span class="nb-shiki-dzsirb"> 7</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --retain-last</span><span class="nb-shiki-dzsirb"> 10</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">table maintenance documentation</a>.</p>Wed, 22 Apr 2026 00:00:00 GMTR2R2R2 Data CatalogCloudflare Network Firewall, Magic Transit, Cloudflare WAN - Country rules supported in Unified Routinghttps://developers.cloudflare.com/changelog/post/2026-04-21-unified-routing-geoip-country-rules/https://developers.cloudflare.com/changelog/post/2026-04-21-unified-routing-geoip-country-rules/<p><a href="https://developers.cloudflare.com/cloudflare-network-firewall/">Cloudflare Advanced Network Firewall</a> Country rules are now supported for accounts using <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta">Unified Routing</a> mode. This feature requires a Cloudflare Advanced Network Firewall subscription.</p> <p>You can create firewall rules that match traffic based on source or destination country to enforce geographic access policies across your network.</p> <p>This is the first of the Cloudflare Advanced Network Firewall features to become available in Unified Routing. Support for additional features - IP Lists, ASN Lists, Threat Intel Lists, IDS, Rate Limiting, SIP, and Managed Rulesets - is planned.</p> <p>For the full list of current beta limitations, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations">Traffic steering beta limitations</a>.</p>Tue, 21 Apr 2026 12:00:00 GMTCloudflare Network FirewallCloudflare Network FirewallMagic TransitCloudflare WANCloudflare Fundamentals - Network Overview page in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-04-21-network-overview-page/https://developers.cloudflare.com/changelog/post/2026-04-21-network-overview-page/<p>A new <strong>Network Overview</strong> page in the Cloudflare dashboard gives you a single starting point for network security and connectivity products.</p> <p>From the Network Overview page, you can:</p> <ul> <li><strong>Connect resources with <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnel</a></strong> - Create tunnels to connect your infrastructure to Cloudflare without exposing it to the public Internet.</li> <li><strong>Monitor traffic with Network Flow</strong> - Get real-time visibility into traffic volume from your routers.</li> <li><strong>Configure Address Maps</strong> - Map dedicated static IPs or BYOIP prefixes to specific hostnames.</li> <li><strong>Explore Magic Transit and Cloudflare WAN</strong> - Set up DDoS protection for your networks and connectivity for your branch offices and data centers.</li> </ul> <p>To find it, go to <a href="https://dash.cloudflare.com/?to=/:account/magic-networks/overview" target="_blank" rel="noopener"><strong>Networking</strong><span class="external-link"> ↗</span></a> in the dashboard sidebar.</p> <p>If you already use <a href="https://developers.cloudflare.com/magic-transit/">Magic Transit</a>, <a href="https://developers.cloudflare.com/cloudflare-wan/">Cloudflare WAN</a>, or other Cloudflare network services products, your existing experience is unchanged.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1650,height=1362,format=webp/_astro/network-overview.4FLDtULW.png" alt="Network Overview page in the Cloudflare dashboard" loading="lazy" decoding="async" width="1650" height="1362">Tue, 21 Apr 2026 12:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWorkflows - Additional step context and ReadableStream support now available in Workflows step.do()https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> now provides additional context inside <code>step.do()</code> callbacks and supports returning <code>ReadableStream</code> to handle larger step outputs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="step-context-properties">Step context properties</h4><a class="anchor-link" href="#step-context-properties"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>step.do()</code> callback receives a context object with new properties <a href="https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/">alongside</a> <code>attempt</code>:</p> <ul> <li><strong><code>step.name</code></strong> — The name passed to <code>step.do()</code></li> <li><strong><code>step.count</code></strong> — How many times a step with that name has been invoked in this instance (1-indexed) <ul> <li>Useful when running the same step in a loop.</li> </ul> </li> <li><strong><code>config</code></strong> — The resolved step configuration, including <code>timeout</code> and <code>retries</code> with defaults applied</li> </ul> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">type</span><span class="nb-shiki-1t8gfj"> ResolvedStepConfig</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> retries</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> limit</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> delay</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowDelayDuration</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> backoff</span><span class="nb-shiki-1itgoe">?:</span><span class="nb-shiki-mdbnqw"> "constant"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-mdbnqw"> "linear"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-mdbnqw"> "exponential"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1jdh33"> timeout</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowTimeoutDuration</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">type</span><span class="nb-shiki-1t8gfj"> WorkflowStepContext</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> step</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> name</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> count</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1jdh33"> attempt</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> config</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ResolvedStepConfig</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="readablestream-support-in-stepdo">ReadableStream support in <code>step.do()</code></h4><a class="anchor-link" href="#readablestream-support-in-stepdo"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Steps can now return a <code>ReadableStream</code> directly. Although non-stream step outputs are <a href="https://developers.cloudflare.com/workflows/reference/limits/">limited to 1 MiB</a>, streamed outputs support much larger payloads.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> largePayload</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"fetch-large-file"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> object</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_BUCKET</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"large-file.bin"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> object.body;</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Note that streamed outputs are still considered part of the Workflow instance storage limit.</p>Tue, 21 Apr 2026 12:00:00 GMTWorkflowsWorkflowsContainers - Container logs page now includes relevant Worker and Durable Object logshttps://developers.cloudflare.com/changelog/post/2026-04-21-correlated-worker-durable-object-logs/https://developers.cloudflare.com/changelog/post/2026-04-21-correlated-worker-durable-object-logs/<p>The Container logs page now displays related <a href="https://developers.cloudflare.com/workers/">Worker</a> and <a href="https://developers.cloudflare.com/durable-objects/">Durable Object</a> logs alongside container logs. This co-locates all relevant log events for a container application in one place, making it easier to trace requests and debug issues.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1682,height=926,format=webp/_astro/container-worker-logs.BBQ7NRse.png" alt="Container logs page showing Worker and Durable Object logs alongside container logs" loading="lazy" decoding="async" width="1682" height="926"> <p>You can filter to a single source when you need to isolate Container, Worker, or Durable Object output.</p> <p>For information on configuring container logging, refer to <a href="https://developers.cloudflare.com/containers/faq/#how-do-container-logs-work">How do Container logs work?</a>.</p>Tue, 21 Apr 2026 00:00:00 GMTContainersContainersCloudflare Fundamentals, Workers - Introducing Billable Usage dashboard and Budget alertshttps://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/<p>Pay-as-you-go customers can now monitor usage-based costs and configure spend alerts through two new features: the Billable Usage dashboard and Budget alerts.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="billable-usage-dashboard">Billable Usage dashboard</h4><a class="anchor-link" href="#billable-usage-dashboard"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Billable Usage dashboard provides daily visibility into usage-based costs across your Cloudflare account. The data comes from the same system that generates your monthly invoice, so the figures match your bill.</p> <p>The dashboard displays:</p> <ul> <li>A bar chart showing daily usage charges for your billing period</li> <li>A sortable table breaking down usage by product, including total usage, billable usage, and cumulative costs</li> <li>Ability to view previous billing periods</li> </ul> <p>Usage data aligns to your billing cycle, not the calendar month. The total usage cost shown at the end of a completed billing period matches the usage overage charges on your corresponding invoice.</p> <p>To access the dashboard, go to <strong>Manage Account</strong> &gt; <strong>Billing</strong> &gt; <strong>Billable Usage</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1033,height=757,format=webp/_astro/billable-usage-dashboard.CQvMdtrp.png" alt="Screenshot of the Billable Usage dashboard in the Cloudflare dashboard" loading="lazy" decoding="async" width="1033" height="757"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="budget-alerts">Budget alerts</h4><a class="anchor-link" href="#budget-alerts"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Budget alerts allow you to set dollar-based thresholds for your account-level usage spend. You receive an email notification when your projected monthly spend reaches your configured threshold, giving you proactive visibility into your bill before month-end.</p> <p>To configure a budget alert:</p> <ol> <li>Go to <strong>Manage Account</strong> &gt; <strong>Billing</strong> &gt; <strong>Billable Usage</strong>.</li> <li>Select <strong>Set Budget Alert</strong>.</li> <li>Enter a budget threshold amount greater than $0.</li> <li>Select <strong>Create</strong>.</li> </ol> <p>Alternatively, configure alerts via <strong>Notifications</strong> &gt; <strong>Add</strong> &gt; <strong>Budget Alert</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=315,height=374,format=webp/_astro/budget-alert-modal.BjIzGOLV.png" alt="Create Budget Alert modal in the Cloudflare dashboard" loading="lazy" decoding="async" width="315" height="374"> <p>You can create multiple budget alerts at different dollar amounts. The notifications system automatically deduplicates alerts if multiple thresholds trigger at the same time. Budget alerts are calculated daily based on your usage trends and fire once per billing cycle when your projected spend first crosses your threshold.</p> <p>Both features are available to Pay-as-you-go accounts with usage-based products (Workers, R2, Images, etc.). Enterprise contract accounts are not supported.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/billing/understand/usage-based-billing/">Usage based billing documentation</a>.</p>Tue, 21 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWorkersLogs - Logpush subrequest merging for HTTP requestshttps://developers.cloudflare.com/changelog/post/2026-04-21-logpush-subrequests-merging/https://developers.cloudflare.com/changelog/post/2026-04-21-logpush-subrequests-merging/<p>When a Cloudflare Worker intercepts a visitor request, it can dispatch additional outbound fetch calls called subrequests. By default, each subrequest generates its own log entry in Logpush, resulting in multiple log lines per visitor request. With subrequest merging enabled, subrequest data is embedded as a nested array field on the parent log record instead.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New subrequest_merging field on Logpush jobs — Set "merge_subrequests": true when creating or updating an http_requests Logpush job to enable the feature.</li> <li>New Subrequests log field — When subrequest merging is enabled, a Subrequests field (<code>array\&lt;object\&gt;</code>) is added to each parent request log record. Each element in the array contains the standard http_requests fields for that subrequest.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="limitations">Limitations</h4><a class="anchor-link" href="#limitations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Applies to the http_requests (zone-scoped) dataset only.</li> <li>A maximum of 50 subrequests are merged per parent request. Subrequests beyond this limit are passed through unmodified as individual log entries.</li> <li>Subrequests must complete within 5 minutes of the visitor request. Subrequests that exceed this window are passed through unmodified.</li> <li>Subrequests that do not qualify appear as separate log entries — no data is lost.</li> <li>Subrequest merging is being gradually rolled out and is not yet available on all zones. Contact your account team for concerns or to ensure it is enabled for your zone.</li> <li>For more information, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/subrequests/">Subrequests</a>.</li> </ul>Tue, 21 Apr 2026 00:00:00 GMTLogsLogsWAF - WAF Release - 2026-04-21https://developers.cloudflare.com/changelog/post/2026-04-21-waf-release/https://developers.cloudflare.com/changelog/post/2026-04-21-waf-release/ <p>This week's release introduces a new detection for a Remote Code Execution (RCE) vulnerability in Apache ActiveMQ (CVE-2026-34197) and an updated signature for Magento 2 - Unrestricted File Upload. Alongside these detections, we are continuing our work on rule refinements to provide deeper security insights for our customers.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Apache ActiveMQ (CVE-2026-34197): A vulnerability in Apache ActiveMQ allows an unauthenticated, remote attacker to execute arbitrary code. This flaw occurs during the processing of specially crafted network packets, leading to potential full system compromise.</p> </li> <li> <p>Magento 2 - Unrestricted File Upload - 2: This is a follow-up enhancement to our existing protections for Magento and Adobe Commerce.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of these vulnerabilities could allow unauthenticated attackers to execute arbitrary code or gain full administrative control over affected servers. We strongly recommend applying official vendor patches for Apache ActiveMQ and Magento to address the underlying vulnerabilities.</p> <p><strong>Continuous Rule Improvements</strong></p> <p>We are continuously refining our managed rules to provide more resilient protection and deeper insights into attack patterns. To ensure an optimal security posture, we recommend consistently monitoring the Security Events dashboard and adjusting rule actions as these enhancements are deployed.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ff8df24181aa4573a81be531ee159e2e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ee159e2e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Command Injection - Generic 8 - uri</td><td>Log</td><td>Block</td><td>This is a new detection. Previous description was "Command Injection - Generic 8 - uri - Beta"</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9429b63c137247faadeb8a29a15308cf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a15308cf</span></button></rule-id></td><td>N/A</td><td>Command Injection - Generic 8 - body - Beta</td><td>Disabled</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "Command Injection - Generic 8 - body" (ID: <rule-id id="5b3ce84c099040c6a25cee2d413592e2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...413592e2</span></button></rule-id>). The rule previously known as "Command Injection - Generic 8" is now renamed to "Command Injection - Generic 8 - body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="85aaf5db9e0c4237b87e837e958047ed"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...958047ed</span></button></rule-id></td><td>N/A</td><td>MySQL - SQLi - Executable Comment - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "MySQL - SQLi - Executable Comment - Body" (ID: <rule-id id="8629bb58defe4193ab4d493c7bd2d8fa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7bd2d8fa</span></button></rule-id>) The rule previously known as "MySQL - SQLi - Executable Comment" is now renamed to "MySQL - SQLi - Executable Comment - Body".</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d19cd574c4644952881a6f3a582cc559"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...582cc559</span></button></rule-id></td><td>N/A</td><td>MySQL - SQLi - Executable Comment - Headers</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="407f9ec8a17348dfba3b9450a16639d3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a16639d3</span></button></rule-id></td><td>N/A</td><td>MySQL - SQLi - Executable Comment - URI</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d07e6dbf15664b99b37b0d2544f24211"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...44f24211</span></button></rule-id></td><td>N/A</td><td>Magento 2 - Unrestricted file upload - 2</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="26ef21cb197b44fc8a98b7cebf170a17"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bf170a17</span></button></rule-id></td><td>N/A</td><td>Apache ActiveMQ - Remote Code Execution - CVE:CVE-2026-34197</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7f7bc3d28a8e43bf97bd15d68c2ac1a7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8c2ac1a7</span></button></rule-id></td><td>N/A</td><td>SQLi - Sleep Function - Beta</td><td>Log</td><td>Block</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Sleep Function" (ID: <rule-id id="2c333735f7b24566b17cb64ef77e8d54"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f77e8d54</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3872e5638bdf4bf0943a80394dacaeb8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4dacaeb8</span></button></rule-id></td><td>N/A</td><td>SQLi - Sleep Function - Headers</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bebce8fadfa94ccab09eb74fed4c9ece"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ed4c9ece</span></button></rule-id></td><td>N/A</td><td>SQLi - Sleep Function - URI</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7a40eed5a8654a50a2598a821dfa64df"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1dfa64df</span></button></rule-id></td><td>N/A</td><td>SQLi - Probing - uri</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="15c6b2ce033949b2a1a9f9454c62e2e7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4c62e2e7</span></button></rule-id></td><td>N/A</td><td>SQLi - Probing - header</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fc9d800b7a724181af8d5650aab28ea1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...aab28ea1</span></button></rule-id></td><td>N/A</td><td>SQLi - Probing - body</td><td>Disabled</td><td>Disabled</td><td><p>This is a new detection. This rule is merged into the original rule "SQLi - Probing" (ID: <rule-id id="2c20b5e8684043f48620ff77b4026c88"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b4026c88</span></button></rule-id>)</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="945c5aa9f45141dd872d7ec920999be0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...20999be0</span></button></rule-id></td><td>N/A</td><td>SQLi - Probing 2 </td><td>Disabled</td><td>Disabled</td><td><p>This rule had duplicate detection logic and has been deprecated.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f1771273700342758e73cf16d7aa0008"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d7aa0008</span></button></rule-id></td><td>N/A</td><td>SQLi - UNION in MSSQL - Body</td><td>Disabled</td><td>Disabled</td><td><p>This rule has been renamed to differentiate from "SQLi - UNION in MSSQL" (ID: <rule-id id="ef7db598c7654c729d9db56fee5e35fd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ee5e35fd</span></button></rule-id>) and contains updated rule logic.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3ffd242b4ba242ca965022d3a67d8561"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a67d8561</span></button></rule-id></td><td>N/A</td><td>SQLi - UNION - 3</td><td>Disabled</td><td>Disabled</td><td><p>This rule had duplicate detection logic and has been deprecated.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5e69d599ad634c81abe36a5f0af34bba"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0af34bba</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Embed Tag - URI</td><td>Disabled</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2635275641bf44d4bad6a2e170282f38"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...70282f38</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Embed Tag - Headers</td><td>Log</td><td>Block</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b3d033ea9f364574b0a2ec4223f4d718"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...23f4d718</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - IFrame Tag - Src and Srcdoc Attributes - Headers</td><td>Log</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="76c37816ef5c4997ab2080a36978def1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6978def1</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Link Tag - Headers</td><td>Log</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7d6757e8a28f4853a72b4ce6ebd81645"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ebd81645</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Link Tag - URI</td><td>Disabled</td><td>Disabled</td><td><p>This is a new detection.</p></td></tr></tbody></table>Tue, 21 Apr 2026 00:00:00 GMTWAFWAFWorkers - WebSocket binary messages now delivered as Blob by defaulthttps://developers.cloudflare.com/changelog/post/2026-04-21-websocket-standard-binary-type/https://developers.cloudflare.com/changelog/post/2026-04-21-websocket-standard-binary-type/<p>Binary frames received on a <code>WebSocket</code> are now delivered to the <code>message</code> event as <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob" target="_blank" rel="noopener"><code>Blob</code><span class="external-link"> ↗</span></a> objects by default. This matches the <a href="https://websockets.spec.whatwg.org/" target="_blank" rel="noopener">WebSocket specification<span class="external-link"> ↗</span></a> and standard browser behavior. Previously, binary frames were always delivered as <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer" target="_blank" rel="noopener"><code>ArrayBuffer</code><span class="external-link"> ↗</span></a>. The <a href="https://developers.cloudflare.com/workers/runtime-apis/websockets/#binarytype"><code>binaryType</code></a> property on <code>WebSocket</code> controls the delivery type on a per-WebSocket basis.</p> <p>This change has been active for Workers with compatibility dates on or after <code>2026-03-17</code>, via the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#websocket-standard-binary-type"><code>websocket_standard_binary_type</code></a> compatibility flag. We should have documented this change when it shipped but didn't. We're sorry for the trouble that caused. If your Worker handles binary WebSocket messages and assumes <code>event.data</code> is an <code>ArrayBuffer</code>, the frames will arrive as <code>Blob</code> instead, and a naive <code>instanceof ArrayBuffer</code> check will silently drop every frame.</p> <p>To opt back into <code>ArrayBuffer</code> delivery, assign <code>binaryType</code> before calling <code>accept()</code>. This works regardless of the compatibility flag:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://example.com"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { Upgrade: </span><span class="nb-shiki-mdbnqw">"websocket"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> ws</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> resp.webSocket;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Opt back into ArrayBuffer delivery for this WebSocket.</span></span> <span class="line"><span class="nb-shiki-140thh">ws.binaryType </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "arraybuffer"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">accept</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">addEventListener</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"message"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">typeof</span><span class="nb-shiki-140thh"> event.data </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "string"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Text frame.</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">else</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // event.data is an ArrayBuffer because we set binaryType above.</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>If you are not ready to migrate and want to keep <code>ArrayBuffer</code> as the default for all WebSockets in your Worker, add the <code>no_websocket_standard_binary_type</code> flag to your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">Wrangler configuration file</a>.</p> <p>This change has no effect on the Durable Object hibernatable WebSocket <a href="https://developers.cloudflare.com/durable-objects/best-practices/websockets/"><code>webSocketMessage</code></a> handler, which continues to receive binary data as <code>ArrayBuffer</code>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers/runtime-apis/websockets/#binary-messages">WebSockets binary messages</a>.</p>Tue, 21 Apr 2026 00:00:00 GMTWorkersWorkersCloudflare One, Gateway - Network session analytics dashboardhttps://developers.cloudflare.com/changelog/post/2026-04-20-network-session-analytics/https://developers.cloudflare.com/changelog/post/2026-04-20-network-session-analytics/<p>The new <a href="https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/">Network session analytics</a> dashboard is now available in Cloudflare One. This dashboard provides visibility into your network traffic patterns, helping you understand how traffic flows through your Cloudflare One infrastructure.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2926,height=1574,format=webp/_astro/cf1-network-session-analytics.Gl90hEcp.png" alt="Cloudflare One Network Session Analytics" loading="lazy" decoding="async" width="2926" height="1574"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-can-do-with-network-session-analytics">What you can do with Network session analytics</h4><a class="anchor-link" href="#what-you-can-do-with-network-session-analytics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Analyze geographic distribution</strong>: View a world map showing where your network traffic originates, with a list of top locations by session count.</li> <li><strong>Monitor key metrics</strong>: Track session count, total bytes transferred, and unique users.</li> <li><strong>Identify connection issues</strong>: Analyze connection close reasons to troubleshoot network problems.</li> <li><strong>Review protocol usage</strong>: See which network protocols (TCP, UDP, ICMP) are most used.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dashboard-features">Dashboard features</h4><a class="anchor-link" href="#dashboard-features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Summary metrics</strong>: Session count, bytes total, and unique users</li> <li><strong>Traffic by location</strong>: World map visualization and location list with top traffic sources</li> <li><strong>Top protocols</strong>: Breakdown of TCP, UDP, ICMP, and ICMPv6 traffic</li> <li><strong>Connection close reasons</strong>: Insights into why sessions terminated (client closed, origin closed, timeouts, errors)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-access">How to access</h4><a class="anchor-link" href="#how-to-access"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Log in to <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare One<span class="external-link"> ↗</span></a>.</li> <li>Go to <strong>Zero Trust</strong> &gt; <strong>Insights</strong> &gt; <strong>Dashboards</strong>.</li> <li>Select <strong>Network session analytics</strong>.</li> </ol> <p>For more information, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/">Network session analytics documentation</a>.</p>Mon, 20 Apr 2026 00:00:00 GMTCloudflare OneCloudflare OneGatewayLogs, Pipelines - Cloudflare Pipelines as a Logpush destinationhttps://developers.cloudflare.com/changelog/post/2026-04-20-pipelines-logpush-destination/https://developers.cloudflare.com/changelog/post/2026-04-20-pipelines-logpush-destination/<p>Logpush has traditionally been great at delivering Cloudflare logs to a variety of destinations in JSON format. While JSON is flexible and easily readable, it can be inefficient to store and query at scale.</p> <p>With this release, you can now send your logs directly to <a href="https://developers.cloudflare.com/pipelines/">Pipelines</a> to ingest, transform, and store your logs in <a href="https://developers.cloudflare.com/r2/">R2</a> as Parquet files or Apache Iceberg tables managed by <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>. This makes the data footprint more compact and more efficient at querying your logs instantly with <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> or any other query engine that supports Apache Iceberg or Parquet.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="transform-logs-before-storage">Transform logs before storage</h4><a class="anchor-link" href="#transform-logs-before-storage"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Pipelines SQL runs on each log record in-flight, so you can reshape your data before it is written. For example, you can drop noisy fields, redact sensitive values, or derive new columns:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">INSERT INTO</span><span class="nb-shiki-140thh"> http_logs_sink</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span></span> <span class="line"><span class="nb-shiki-140thh"> ClientIP,</span></span> <span class="line"><span class="nb-shiki-140thh"> EdgeResponseStatus,</span></span> <span class="line"><span class="nb-shiki-140thh"> to_timestamp_micros(EdgeStartTimestamp) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> event_time,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> upper</span><span class="nb-shiki-140thh">(ClientRequestMethod) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> method,</span></span> <span class="line"><span class="nb-shiki-140thh"> sha256(ClientIP) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> hashed_ip</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> http_logs_stream</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> EdgeResponseStatus </span><span class="nb-shiki-1itgoe">&gt;=</span><span class="nb-shiki-dzsirb"> 400</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure> <p>Pipelines SQL supports string functions, regex, hashing, JSON extraction, timestamp conversion, conditional expressions, and more. For the full list, refer to the <a href="https://developers.cloudflare.com/pipelines/sql-reference/">Pipelines SQL reference</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To configure Pipelines as a Logpush destination, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/pipelines/">Enable Cloudflare Pipelines</a>.</p>Mon, 20 Apr 2026 00:00:00 GMTLogsLogsPipelinesR2 SQL - R2 SQL adds JSON functions, EXPLAIN FORMAT JSON, and unpartitioned table supporthttps://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/https://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/<p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> is Cloudflare's serverless, distributed, analytics query engine for querying <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>.</p> <p>R2 SQL now supports functions for querying JSON data stored in Apache Iceberg tables, an easier way to parse query plans with <code>EXPLAIN FORMAT JSON</code>, and querying tables without partition keys stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>.</p> <p>JSON functions extract and manipulate JSON values directly in SQL without client-side processing:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span></span> <span class="line"><span class="nb-shiki-140thh"> json_get_str(doc, </span><span class="nb-shiki-mdbnqw">'name'</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-1itgoe"> name</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> json_get_int(doc, </span><span class="nb-shiki-mdbnqw">'user'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'profile'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'level'</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-1itgoe"> level</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> json_get_bool(doc, </span><span class="nb-shiki-mdbnqw">'active'</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> is_active</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> json_contains(doc, </span><span class="nb-shiki-mdbnqw">'email'</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>For a full list of available functions, refer to <a href="https://developers.cloudflare.com/r2-sql/sql-reference/scalar-functions/#json-functions">JSON functions</a>.</p> <p><code>EXPLAIN FORMAT JSON</code> returns query execution plans as structured JSON for programmatic analysis and observability integrations:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> sql</span><span class="nb-shiki-mdbnqw"> query</span><span class="nb-shiki-mdbnqw"> "${</span><span class="nb-shiki-140thh">WAREHOUSE</span><span class="nb-shiki-mdbnqw">}"</span><span class="nb-shiki-mdbnqw"> "EXPLAIN FORMAT JSON SELECT * FROM logpush.requests LIMIT 10;"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">┌──────────────────────────────────────┐</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> plan</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> {</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "name":</span><span class="nb-shiki-mdbnqw"> "CoalescePartitionsExec",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "output_partitions":</span><span class="nb-shiki-mdbnqw"> 1,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "rows":</span><span class="nb-shiki-mdbnqw"> 10,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "size_approx":</span><span class="nb-shiki-mdbnqw"> "310B",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "children":</span><span class="nb-shiki-140thh"> [ </span><span class="nb-shiki-mdbnqw">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> {</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "name":</span><span class="nb-shiki-mdbnqw"> "DataSourceExec",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "output_partitions":</span><span class="nb-shiki-mdbnqw"> 4,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "rows":</span><span class="nb-shiki-mdbnqw"> 28951,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "size_approx":</span><span class="nb-shiki-mdbnqw"> "900.0KB",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "table":</span><span class="nb-shiki-mdbnqw"> "logpush.requests",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "files":</span><span class="nb-shiki-mdbnqw"> 7,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "bytes":</span><span class="nb-shiki-mdbnqw"> 900019,</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "projection":</span><span class="nb-shiki-140thh"> [ </span><span class="nb-shiki-mdbnqw">│</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "__ingest_ts",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "CPUTimeMs",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "DispatchNamespace",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "Entrypoint",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "Event",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "EventTimestampMs",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "EventType",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "Exceptions",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "Logs",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "Outcome",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "ScriptName",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "ScriptTags",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "ScriptVersion",</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "WallTimeMs"</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> ],</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> "limit":</span><span class="nb-shiki-dzsirb"> 10</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> }</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> ]</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> }</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">└──────────────────────────────────────┘</span></span></code></pre></figure> <p>For more details, refer to <a href="https://developers.cloudflare.com/r2-sql/sql-reference/#explain">EXPLAIN</a>.</p> <p>Unpartitioned Iceberg tables can now be queried directly, which is useful for smaller datasets or data without natural time dimensions. For tables with more than 1000 files, partitioning is still recommended for better performance.</p> <p>Refer to <a href="https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/">Limitations and best practices</a> for the latest guidance on using R2 SQL.</p>Mon, 20 Apr 2026 00:00:00 GMTR2 SQLR2 SQLSecurity Overview - Archive and audit security action itemshttps://developers.cloudflare.com/changelog/post/2026-04-27-archive-and-audit-security-action-items/https://developers.cloudflare.com/changelog/post/2026-04-27-archive-and-audit-security-action-items/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="archive-and-audit-security-action-items">Archive and audit security action items</h4><a class="anchor-link" href="#archive-and-audit-security-action-items"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Introducing enhanced archiving capabilities for security action items within the Security Overview dashboard. This update allows security teams to maintain a cleaner workspace by removing resolved, accepted, or irrelevant items from their active list while maintaining a clear paper trail for compliance.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Managing a high volume of security insights can be overwhelming. Previously, users lacked a structured way to dismiss items without losing the context of why they were ignored.</p> <p>With these new archiving options—<strong>False Positive</strong>, <strong>Accept Risk</strong>, and <strong>Other</strong>—you can now suppress items indefinitely with required rationale text for risk-based decisions. This ensures that your team remains focused on critical, actionable vulnerabilities while preserving institutional knowledge for audits.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-features">Key features</h4><a class="anchor-link" href="#key-features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Structured Archiving:</strong> Choose from specific categories to define why an action item is being moved.</li> <li><strong>Required Rationale:</strong> For "Accept Risk" and "Other" categories, users must provide documentation, ensuring accountability for security decisions.</li> <li><strong>Audit Log Transparency:</strong> New API endpoints allow you to programmatically retrieve the history of status changes and rationale for any insight at the account or zone level.</li> <li><strong>Reversible Actions:</strong> Any archived item can be moved back to the active list at any time if the security context changes.</li> </ul> <p>:::note Archiving a suspicious activity item will remove it from the Security Overview page, but the activity will remain visible in your Security Analytics dashboard for deeper forensic analysis. :::</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-retrieve-audit-logs-via-api">Example: Retrieve audit logs via API</h4><a class="anchor-link" href="#example-retrieve-audit-logs-via-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To review the history and rationale of a specific archived issue at the account level, you can use the following API command:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "[https://api.cloudflare.com/client/v4/accounts/](https://api.cloudflare.com/client/v4/accounts/){account_id}/insights/{insight_id}/audit-log"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span></span></code></pre></figure> Mon, 20 Apr 2026 00:00:00 GMTSecurity OverviewSecurity OverviewWorkers AI - Moonshot AI Kimi K2.6 now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-04-20-kimi-k2-6-workers-ai/https://developers.cloudflare.com/changelog/post/2026-04-20-kimi-k2-6-workers-ai/<p><a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/"><code>@cf/moonshotai/kimi-k2.6</code></a> is now available on Workers AI, in partnership with Moonshot AI for Day 0 support. Kimi K2.6 is a native multimodal agentic model from Moonshot AI that advances practical capabilities in long-horizon coding, coding-driven design, proactive autonomous execution, and swarm-based task orchestration.</p> <p>Built on a Mixture-of-Experts architecture with 1T total parameters and 32B active per token, Kimi K2.6 delivers frontier-scale intelligence with efficient inference. It scores competitively against GPT-5.4 and Claude Opus 4.6 on agentic and coding benchmarks, including BrowseComp (83.2), SWE-Bench Verified (80.2), and Terminal-Bench 2.0 (66.7).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>262.1k token context window</strong> for retaining full conversation history, tool definitions, and codebases across long-running agent sessions</li> <li><strong>Long-horizon coding</strong> with significant improvements on complex, end-to-end coding tasks across languages including Rust, Go, and Python</li> <li><strong>Coding-driven design</strong> that transforms simple prompts and visual inputs into production-ready interfaces and full-stack workflows</li> <li><strong>Agent swarm orchestration</strong> scaling horizontally to 300 sub-agents executing 4,000 coordinated steps for complex autonomous tasks</li> <li><strong>Vision inputs</strong> for processing images alongside text</li> <li><strong>Thinking mode</strong> with configurable reasoning depth</li> <li><strong>Multi-turn tool calling</strong> for building agents that invoke tools across multiple conversation turns</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="differences-from-kimi-k25">Differences from Kimi K2.5</h4><a class="anchor-link" href="#differences-from-kimi-k25"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are migrating from Kimi K2.5, note the following API changes:</p> <ul> <li>K2.6 uses <code>chat_template_kwargs.thinking</code> to control reasoning, replacing <code>chat_template_kwargs.enable_thinking</code></li> <li>K2.6 returns reasoning content in the <code>reasoning</code> field, replacing <code>reasoning_content</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Kimi K2.6 through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/ai/run</code>, or the OpenAI-compatible endpoint at <code>/v1/chat/completions</code>. You can also use <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> with any of these endpoints.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/">Kimi K2.6 model page</a> and <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing</a>.</p>Mon, 20 Apr 2026 00:00:00 GMTWorkers AIWorkers AIAccess - Homepage and sign-out for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-04-17-mcp-portal-homepage-and-sign-out/https://developers.cloudflare.com/changelog/post/2026-04-17-mcp-portal-homepage-and-sign-out/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> display a homepage when users visit the portal domain in a browser.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1037,height=631,format=webp/_astro/portals-homepage-disconnected.BHbOwayQ.png" alt="MCP server portal homepage showing connection status and setup instructions" loading="lazy" decoding="async" width="1037" height="631"> <p>The homepage shows:</p> <ul> <li>The portal name and organization branding</li> <li>The MCP endpoint URL with a copy button</li> <li>Per-client connection instructions for Claude Desktop, Workers AI Playground, OpenCode, Windsurf, and other MCP clients</li> </ul> <p>Authenticated users see their email address and a <strong>Sign out</strong> button. Selecting <strong>Sign out</strong> revokes all portal-level OAuth grants, deletes upstream server OAuth states, and redirects through Cloudflare Access logout. A confirmation page shows a summary of the revoked sessions.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#portal-homepage">MCP server portals</a>.</p>Fri, 17 Apr 2026 00:00:00 GMTAccessAccessAI Crawl Control - Introducing Redirects for AI Traininghttps://developers.cloudflare.com/changelog/post/2026-04-17-redirects-for-ai-training/https://developers.cloudflare.com/changelog/post/2026-04-17-redirects-for-ai-training/<p>Cloudflare's network now supports redirecting verified AI training crawlers to canonical URLs when they request deprecated or duplicate pages. When enabled via <strong>AI Crawl Control</strong> &gt; <strong>Quick Actions</strong>, AI training crawlers that request a page with a canonical tag pointing elsewhere receive a 301 redirect to the canonical version. Humans, search engine crawlers, and AI Search agents continue to see the original page normally.</p> <p>This feature leverages your existing <code>&lt;link rel="canonical"&gt;</code> tags. No additional configuration required beyond enabling the toggle. Available on Pro, Business, and Enterprise plans at no additional cost.</p> <p>Refer to the <a href="https://developers.cloudflare.com/ai-crawl-control/reference/redirects-for-ai-training/">Redirects for AI Training documentation</a> for details.</p>Fri, 17 Apr 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlAI Crawl Control - Tools to prepare your site for the agentic Internethttps://developers.cloudflare.com/changelog/post/2026-04-17-tools-for-agentic-internet/https://developers.cloudflare.com/changelog/post/2026-04-17-tools-for-agentic-internet/<p>AI Crawl Control now includes new tools to help you prepare your site for the agentic Internet—a web where AI agents are first-class citizens that discover and interact with content differently than human visitors.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="content-format-insights">Content Format insights</h4><a class="anchor-link" href="#content-format-insights"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Metrics</strong> tab now includes a <strong>Content Format</strong> chart showing what content types AI systems request versus what your origin serves. Understanding these patterns helps you optimize content delivery for both human and agent consumption.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="directives-tab-formerly-robotstxt">Directives tab (formerly Robots.txt)</h4><a class="anchor-link" href="#directives-tab-formerly-robotstxt"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Robots.txt</strong> tab has been renamed to <strong>Directives</strong> and now includes a link to check your site's <a href="https://isitagentready.com" target="_blank" rel="noopener">Agent Readiness<span class="external-link"> ↗</span></a> score.</p> <p>Refer to our <a href="https://blog.cloudflare.com/agent-readiness/" target="_blank" rel="noopener">blog post on preparing for the agentic Internet<span class="external-link"> ↗</span></a> for more on why these capabilities matter.</p>Fri, 17 Apr 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlCache - Smart Tiered Cache optimizes public cloud originshttps://developers.cloudflare.com/changelog/post/2026-04-17-smart-tiered-cache-for-public-cloud/https://developers.cloudflare.com/changelog/post/2026-04-17-smart-tiered-cache-for-public-cloud/<p>You can now achieve higher cache HIT rates and reduce origin load for origins hosted on public cloud providers with <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#smart-tiered-cache">Smart Tiered Cache</a>. By setting a cloud region hint for your origin, Cloudflare selects the optimal upper-tier data center for that cloud region, funneling all cache MISSes through a single location close to your origin.</p> <p>Previously, Smart Tiered Cache could not reliably select an optimal upper tier for origins behind anycast or regional unicast networks commonly used by cloud providers. Origins on AWS, GCP, Azure, and Oracle Cloud would fall back to a multi-upper-tier topology, resulting in lower cache HIT rates and more requests reaching your origin.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Set a cloud region hint (for example, <code>aws/us-east-1</code> or <code>gcp/europe-west1</code>) for your origin IP or hostname. Smart Tiered Cache uses this hint along with real-time latency data to select a primary upper tier close to your cloud region, plus a fallback in a different location for resilience.</p> <ul> <li><strong>Supported providers</strong>: AWS, GCP, Azure, and Oracle Cloud.</li> <li><strong>All plans</strong>: Available on Free, Pro, Business, and Enterprise plans at no additional cost.</li> <li><strong>Dashboard and API</strong>: Configure from <strong>Caching</strong> &gt; <strong>Tiered Cache</strong> &gt; <strong>Origin Configuration</strong>, or use the API and Terraform.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, enable <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a> and set a cloud region hint for your origin in the <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#public-cloud-origins">Tiered Cache settings</a>.</p>Fri, 17 Apr 2026 00:00:00 GMTCacheCacheRadar - AI Insights updates on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-04-17-radar-ai-insights-updates/https://developers.cloudflare.com/changelog/post/2026-04-17-radar-ai-insights-updates/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> adds three new features to the <a href="https://radar.cloudflare.com/ai-insights" target="_blank" rel="noopener">AI Insights<span class="external-link"> ↗</span></a> page, expanding visibility into how AI bots, crawlers, and agents interact with the web.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="adoption-of-ai-agent-standards">Adoption of AI agent standards</h4><a class="anchor-link" href="#adoption-of-ai-agent-standards"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The AI Insights page now includes an <a href="https://radar.cloudflare.com/ai-insights#adoption-of-ai-agent-standards" target="_blank" rel="noopener">adoption of AI agent standards<span class="external-link"> ↗</span></a> widget that tracks how websites adopt agent-facing standards. The data is filterable by domain category and updated weekly on Mondays. This data is also available through the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/agent_readiness/methods/summary/">Agent Readiness API reference</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1332,format=webp/_astro/agent-readiness-adoption-chart.B3ATN59P.png" alt="Screenshot of the adoption of AI agent standards chart" loading="lazy" decoding="async" width="1600" height="1332"> <p><a href="https://radar.cloudflare.com/scan" target="_blank" rel="noopener">URL Scanner<span class="external-link"> ↗</span></a> reports now include an <strong>Agent readiness</strong> tab that evaluates a scanned URL against the criteria used by the <a href="https://isitagentready.com/" target="_blank" rel="noopener">Agent Readiness score tool<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1999,height=1145,format=webp/_astro/agent-readiness-url-scanner.DRVuuaUi.png" alt="Screenshot of the URL Scanner agent readiness tab" loading="lazy" decoding="async" width="1999" height="1145"> <p>For more details, refer to the <a href="https://blog.cloudflare.com/agent-readiness/" target="_blank" rel="noopener">Agent Readiness blog post<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="markdown-for-agents-savings">Markdown for Agents savings</h4><a class="anchor-link" href="#markdown-for-agents-savings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <a href="https://radar.cloudflare.com/ai-insights#markdown-for-agents-savings" target="_blank" rel="noopener">savings gauge<span class="external-link"> ↗</span></a> shows the median response-size reduction when serving Markdown instead of HTML to AI bots and crawlers. This highlights the bandwidth and token savings that <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">Markdown for Agents</a> provides.</p> <div style="max-width: 300px;"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=614,height=652,format=webp/_astro/markdown-for-agents-savings.Di1GjNON.png" alt="Screenshot of the Markdown for Agents savings gauge" loading="lazy" decoding="async" width="614" height="652"></div> <p>For more details, refer to the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/markdown_for_agents/methods/summary">Markdown for Agents API reference</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="response-status">Response status</h4><a class="anchor-link" href="#response-status"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://radar.cloudflare.com/ai-insights#response-status" target="_blank" rel="noopener">response status widget<span class="external-link"> ↗</span></a> displays the distribution of HTTP response status codes returned to AI bots and crawlers. Results are groupable by individual status code (200, 403, 404) or by category (2xx, 3xx, 4xx, 5xx).</p> <p>The same widget is available on each verified bot's detail page (only available for AI bots), for example <a href="https://radar.cloudflare.com/bots/directory/google#response-status" target="_blank" rel="noopener">Google<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/ai-response-status.BwSMF23Z.png" alt="Screenshot of the response status distribution widget" loading="lazy" decoding="async" width="1600" height="878"> <p>Explore all three features on the <a href="https://radar.cloudflare.com/ai-insights" target="_blank" rel="noopener">Cloudflare Radar AI Insights<span class="external-link"> ↗</span></a> page.</p>Fri, 17 Apr 2026 00:00:00 GMTRadarRadarAI Search - AI Search instances now include built-in storage and namespace Workers Bindingshttps://developers.cloudflare.com/changelog/post/2026-04-16-ai-search-namespace-binding/https://developers.cloudflare.com/changelog/post/2026-04-16-ai-search-namespace-binding/<p>New <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> instances created after today will work differently. New instances come with built-in storage and a vector index, so you can upload a file, have it indexed immediately, and search it right away.</p> <p>Additionally new Workers Bindings are now available to use with AI Search. The new namespace binding lets you create and manage instances at runtime, and cross-instance search API lets you query across multiple instances in one call.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="built-in-storage-and-vector-index">Built-in storage and vector index</h4><a class="anchor-link" href="#built-in-storage-and-vector-index"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>All new instances now comes with built-in storage which allows you to upload files directly to it using the <a href="https://developers.cloudflare.com/ai-search/api/items/workers-binding/">Items API</a> or the dashboard. No R2 buckets to set up, no external data sources to connect first.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-instance"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// upload and wait for indexing to complete</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> item</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> instance.items.</span><span class="nb-shiki-1t8gfj">uploadAndPoll</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"faq.md"</span><span class="nb-shiki-140thh">, content);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// search immediately after indexing</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> results</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"onboarding guide"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="namespace-binding">Namespace binding</h4><a class="anchor-link" href="#namespace-binding"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>ai_search_namespaces</code> binding replaces the previous <code>env.AI.autorag()</code> API provided through the <code>AI</code> binding. It gives your Worker access to all instances within a <a href="https://developers.cloudflare.com/ai-search/concepts/namespaces/">namespace</a> and lets you create, update, and delete instances at runtime without redeploying.</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-21nrsd">// wrangler.jsonc</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ai_search_namespaces"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"AI_SEARCH"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "namespace"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"default"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// create an instance at runtime</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> id: </span><span class="nb-shiki-mdbnqw">"my-instance"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>For migration details, refer to <a href="https://developers.cloudflare.com/ai-search/api/migration/workers-binding/">Workers binding migration</a>. For more on namespaces, refer to <a href="https://developers.cloudflare.com/ai-search/concepts/namespaces/">Namespaces</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cross-instance-search">Cross-instance search</h4><a class="anchor-link" href="#cross-instance-search"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Within the new AI Search binding, you now have access to a Search and Chat API on the namespace level. Pass an array of instance IDs and get one ranked list of results back.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> results</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"What is Cloudflare?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> ai_search_options: {</span></span> <span class="line"><span class="nb-shiki-140thh"> instance_ids: [</span><span class="nb-shiki-mdbnqw">"product-docs"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"customer-abc123"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/ai-search/api/search/workers-binding/#namespace-level">Namespace-level search</a> for details.</p>Thu, 16 Apr 2026 12:00:00 GMTAI SearchAI SearchAI Search - AI Search now has hybrid search and relevance boostinghttps://developers.cloudflare.com/changelog/post/2026-04-16-hybrid-search-and-relevance-boosting/https://developers.cloudflare.com/changelog/post/2026-04-16-hybrid-search-and-relevance-boosting/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports hybrid search and relevance boosting, giving you more control over how results are found and ranked.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="hybrid-search">Hybrid search</h4><a class="anchor-link" href="#hybrid-search"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Hybrid search combines vector (semantic) search with BM25 keyword search in a single query. Vector search finds chunks with similar meaning, even when the exact words differ. Keyword search matches chunks that contain your query terms exactly. When you enable hybrid search, both run in parallel and the results are fused into a single ranked list.</p> <p>You can configure the tokenizer (<code>porter</code> for natural language, <code>trigram</code> for code), keyword match mode (<code>and</code> for precision, <code>or</code> for recall), and fusion method (<code>rrf</code> or <code>max</code>) per instance:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> id: </span><span class="nb-shiki-mdbnqw">"my-instance"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> index_method: { vector: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">, keyword: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> fusion_method: </span><span class="nb-shiki-mdbnqw">"rrf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> indexing_options: { keyword_tokenizer: </span><span class="nb-shiki-mdbnqw">"porter"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> retrieval_options: { keyword_match_mode: </span><span class="nb-shiki-mdbnqw">"and"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/ai-search/concepts/search-modes/">Search modes</a> for an overview and <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/hybrid-search/">Hybrid search</a> for configuration details.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="relevance-boosting">Relevance boosting</h4><a class="anchor-link" href="#relevance-boosting"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Relevance boosting lets you nudge search rankings based on document metadata. For example, you can prioritize recent documents by boosting on <code>timestamp</code>, or surface high-priority content by boosting on a custom metadata field like <code>priority</code>.</p> <p>Configure up to 3 boost fields per instance or override them per request:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> results</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-instance"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"deployment guide"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> ai_search_options: {</span></span> <span class="line"><span class="nb-shiki-140thh"> retrieval: {</span></span> <span class="line"><span class="nb-shiki-140thh"> boost_by: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { field: </span><span class="nb-shiki-mdbnqw">"timestamp"</span><span class="nb-shiki-140thh">, direction: </span><span class="nb-shiki-mdbnqw">"desc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { field: </span><span class="nb-shiki-mdbnqw">"priority"</span><span class="nb-shiki-140thh">, direction: </span><span class="nb-shiki-mdbnqw">"desc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/boosting/">Relevance boosting</a> for configuration details.</p>Thu, 16 Apr 2026 12:00:00 GMTAI SearchAI SearchArtifacts - Artifacts now in beta: versioned filesystem with Git accesshttps://developers.cloudflare.com/changelog/post/2026-04-16-artifacts-now-in-beta/https://developers.cloudflare.com/changelog/post/2026-04-16-artifacts-now-in-beta/<p><a href="https://developers.cloudflare.com/artifacts/">Artifacts</a> is now in private beta. Artifacts is Git-compatible storage built for scale: create tens of millions of repos, fork from any remote, and hand off a URL to any Git client. It provides a versioned filesystem for storing and exchanging file trees across Workers, the REST API, and any Git client, running locally or within an agent.</p> <p>You can <a href="https://blog.cloudflare.com/artifacts-git-for-agents-beta/" target="_blank" rel="noopener">read the announcement blog<span class="external-link"> ↗</span></a> to learn more about what Artifacts does, how it works, and how to create repositories for your agents to use.</p> <p>Artifacts has three API surfaces:</p> <ul> <li>Workers bindings (for creating and managing repositories)</li> <li>REST API (for creating and managing repos from any other compute platform)</li> <li>Git protocol (for interacting with repos)</li> </ul> <p>As an example: you can use the Workers binding to create a repo and read back its remote URL:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-140thh"># Create a thousand, a million or ten million </span><span class="nb-shiki-1t8gfj">repos</span><span class="nb-shiki-140thh">: one for every agent, for every upstream branch, or every user.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> created</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">PROD_ARTIFACTS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"agent-007"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> remote</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> created.repo.</span><span class="nb-shiki-1t8gfj">info</span><span class="nb-shiki-140thh">())?.remote;</span></span></code></pre></figure> <p>Or, use the REST API to create a repo inside a namespace from your agent(s) running on any platform:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://artifacts.cloudflare.net/v1/api/namespaces/some-namespace/repos"</span><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{"name":"agent-007"}'</span></span></code></pre></figure> <p>Any Git client that speaks smart HTTP can use the returned remote URL:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Agents know git.</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Every repository can act as a git repo, allowing agents to interact with Artifacts the way they know best: using the git CLI.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">git</span><span class="nb-shiki-mdbnqw"> clone</span><span class="nb-shiki-mdbnqw"> https://x:</span><span class="nb-shiki-140thh">${REPO_TOKEN}</span><span class="nb-shiki-mdbnqw">@artifacts.cloudflare.net/some-namespace/agent-007.git</span></span></code></pre></figure> <p>To learn more, refer to <a href="https://developers.cloudflare.com/artifacts/get-started/">Get started</a>, <a href="https://developers.cloudflare.com/artifacts/api/workers-binding/">Workers binding</a>, and <a href="https://developers.cloudflare.com/artifacts/api/git-protocol/">Git protocol</a>.</p>Thu, 16 Apr 2026 00:00:00 GMTArtifactsArtifactsEmail Service - Email Sending now in public betahttps://developers.cloudflare.com/changelog/post/2026-04-16-email-sending-public-beta/https://developers.cloudflare.com/changelog/post/2026-04-16-email-sending-public-beta/ <p><strong><a href="https://developers.cloudflare.com/email-service/api/send-emails/">Email Sending</a></strong> is now in public beta. Send transactional emails directly from Workers (<code>env.EMAIL.send()</code>) or the REST API, with support for HTML, plain text, attachments, inline images, and custom headers. Email Sending joins <a href="https://blog.cloudflare.com/introducing-email-routing/" target="_blank" rel="noopener">Email Routing<span class="external-link"> ↗</span></a> under the new <strong>Cloudflare Email Service</strong> — a single service for sending and receiving email on the Cloudflare developer platform.</p> <p>Send an email from a Worker in a few lines of code:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EMAIL</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> from: </span><span class="nb-shiki-mdbnqw">"notifications@yourdomain.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> to: </span><span class="nb-shiki-mdbnqw">"user@example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> subject: </span><span class="nb-shiki-mdbnqw">"Order confirmed"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> html: </span><span class="nb-shiki-mdbnqw">"&#x3C;h1>Your order has been confirmed&#x3C;/h1>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> text: </span><span class="nb-shiki-mdbnqw">"Your order has been confirmed."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ messageId: response.messageId });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">EMAIL</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> from: </span><span class="nb-shiki-mdbnqw">"notifications@yourdomain.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> to: </span><span class="nb-shiki-mdbnqw">"user@example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> subject: </span><span class="nb-shiki-mdbnqw">"Order confirmed"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> html: </span><span class="nb-shiki-mdbnqw">"&#x3C;h1>Your order has been confirmed&#x3C;/h1>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> text: </span><span class="nb-shiki-mdbnqw">"Your order has been confirmed."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({ messageId: response.messageId });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">>;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Email Service also integrates with the <a href="https://developers.cloudflare.com/agents/">Agents SDK</a>, giving your agents a native <code>onEmail</code> hook to receive, process, and reply to emails. Combined with the new <a href="https://github.com/cloudflare/mcp-server-cloudflare" target="_blank" rel="noopener">Email MCP server<span class="external-link"> ↗</span></a> and Wrangler CLI email commands, any agent can send email regardless of where it runs.</p> <p>Start sending and receiving emails from Workers and agents today. Email Sending is available on the Workers paid plan. Refer to the <a href="https://developers.cloudflare.com/email-service/">Email Service documentation</a> to get started.</p>Thu, 16 Apr 2026 00:00:00 GMTEmail ServiceEmail ServiceWorkflows, Workers - Increased concurrency, creation rate, and queued instance limits for Workflows instanceshttps://developers.cloudflare.com/changelog/post/2026-04-15-workflows-limits-raised/https://developers.cloudflare.com/changelog/post/2026-04-15-workflows-limits-raised/<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> limits have been raised to the following:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Limit</th> <th>Previous</th> <th>New</th> </tr> </thead> <tbody> <tr> <td>Concurrent instances (running in parallel)</td> <td>10,000</td> <td>50,000</td> </tr> <tr> <td>Instance creation rate (per account)</td> <td>100/second per account</td> <td>300/second per account, 100/second per workflow</td> </tr> <tr> <td>Queued instances per Workflow <sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup></td> <td>1 million</td> <td>2 million</td> </tr> </tbody> </table></div> <p>These increases apply to all users on the <a href="https://developers.cloudflare.com/workers/platform/pricing/">Workers Paid plan</a>. Refer to the <a href="https://developers.cloudflare.com/workflows/reference/limits/">Workflows limits documentation</a> for more details.</p> <section data-footnotes class="footnotes"><div tabindex="-1" class="heading-wrapper level-h4"><h4 class="sr-only" id="footnote-label">Footnotes</h4><a class="anchor-link" href="#footnote-label"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li id="user-content-fn-1"> <p>Queued instances are instances that have been created or awoken and are waiting for a concurrency slot. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>Wed, 15 Apr 2026 13:00:00 GMTWorkflowsWorkflowsWorkersBrowser Run - Browser Rendering is now Browser Runhttps://developers.cloudflare.com/changelog/post/2026-04-15-br-rename/https://developers.cloudflare.com/changelog/post/2026-04-15-br-rename/<p>We are renaming Browser Rendering to <strong><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a></strong>. The name Browser Rendering never fully captured what the product does. Browser Run lets you run full browser sessions on Cloudflare's global network, drive them with code or AI, record and replay sessions, crawl pages for content, debug in real time, and let humans intervene when your agent needs help.</p> <p>Along with the rename, we have increased limits for Workers Paid plans and redesigned the Browser Run dashboard.</p> <p>We have 4x-ed concurrency limits for Workers Paid plan users:</p> <ul> <li><strong>Concurrent browsers per account</strong>: 30 → <strong>120 per account</strong></li> <li><strong>New browser instances</strong>: 30 per minute → <strong>1 per second</strong></li> <li><strong>REST API rate limits</strong>: recently increased from <a href="https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/">3 to 10 requests per second</a></li> </ul> <p>Rate limits across the <a href="https://developers.cloudflare.com/browser-run/limits/">limits page</a> are now expressed in per-second terms, matching how they are enforced. No action is needed to benefit from the higher limits.</p> <p>The <a href="https://dash.cloudflare.com/?to=/:account/workers/browser-run" target="_blank" rel="noopener">redesigned dashboard<span class="external-link"> ↗</span></a> now shows every request in a single Runs tab, not just browser sessions but also quick actions like screenshots, PDFs, markdown, and crawls. Filter by endpoint, view target URLs, status, and duration, and expand any row for more detail.</p> <img src="https://developers.cloudflare.com/images/browser-run/BRdashboardredesign.png" alt="Browser Run dashboard Runs tab with browser sessions and quick actions visible in one list, and an expanded crawl job showing its progress"> <p>We are also shipping several new features:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/">Live View, Human in the Loop, and Session Recordings</a></strong> - See what your agent is doing in real time, let humans step in when automation hits a wall, and replay any session after it ends.</li> <li><strong><a href="https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/">WebMCP</a></strong> - Websites can expose structured tools for AI agents to discover and call directly, replacing slow screenshot-analyze-click loops.</li> </ul> <p>For the full story, read our Agents Week blog <a href="https://blog.cloudflare.com/browser-run-for-ai-agents" target="_blank" rel="noopener">Browser Run: Give your agents a browser<span class="external-link"> ↗</span></a>.</p>Wed, 15 Apr 2026 12:00:00 GMTBrowser RunBrowser RunBrowser Run - Browser Run adds Live View, Human in the Loop, and Session Recordingshttps://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/https://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/<p>When browser automation fails or behaves unexpectedly, it can be hard to understand what happened. We are shipping three new features in <a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> (formerly Browser Rendering) to help:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/browser-run/features/live-view/">Live View</a></strong> for real-time visibility</li> <li><strong><a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop</a></strong> for human intervention</li> <li><strong><a href="https://developers.cloudflare.com/browser-run/features/session-recording/">Session Recordings</a></strong> for replaying sessions after they end</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="live-view">Live View</h4><a class="anchor-link" href="#live-view"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developers.cloudflare.com/browser-run/features/live-view/">Live View</a> lets you see what your agent is doing in real time. The page, DOM, console, and network requests are all visible for any active browser session. Access Live View from the Cloudflare dashboard, via the hosted UI at <code>live.browser.run</code>, or using native Chrome DevTools.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="human-in-the-loop">Human in the Loop</h4><a class="anchor-link" href="#human-in-the-loop"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When your agent hits a snag like a login page or unexpected edge case, it can hand off to a human instead of failing. With <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop</a>, a human steps into the live browser session through Live View, resolves the issue, and hands control back to the script.</p> <p>Today, you can step in by opening the Live View URL for any active session. Next, we are adding a handoff flow where the agent can signal that it needs help, notify a human to step in, then hand control back to the agent once the issue is resolved.</p> <img src="https://developers.cloudflare.com/images/browser-run/liveview.gif" alt="Browser Run Human in the Loop demo where an AI agent searches Amazon, selects a product, and requests human help when authentication is needed to buy"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="session-recordings">Session Recordings</h4><a class="anchor-link" href="#session-recordings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developers.cloudflare.com/browser-run/features/session-recording/">Session Recordings</a> records DOM state so you can replay any session after it ends. Enable recordings by passing <code>recording: true</code> when launching a browser. After the session closes, view the recording in the Cloudflare dashboard under <strong>Browser Run</strong> &gt; <strong>Runs</strong>, or retrieve via API using the session ID. Next, we are adding the ability to inspect DOM state and console output at any point during the recording.</p> <img src="https://developers.cloudflare.com/images/browser-run/sessionrecording.gif" alt="Browser Run session recording showing an automated browser navigating the Sentry Shop and adding a bomber jacket to the cart"> <p>To get started, refer to the documentation for <a href="https://developers.cloudflare.com/browser-run/features/live-view/">Live View</a>, <a href="https://developers.cloudflare.com/browser-run/features/human-in-the-loop/">Human in the Loop</a>, and <a href="https://developers.cloudflare.com/browser-run/features/session-recording/">Session Recording</a>.</p>Wed, 15 Apr 2026 11:00:00 GMTBrowser RunBrowser RunBrowser Run - Browser Run adds WebMCP supporthttps://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Run</a> (formerly Browser Rendering) now supports <a href="https://webmachinelearning.github.io/webmcp/" target="_blank" rel="noopener">WebMCP<span class="external-link"> ↗</span></a> (Web Model Context Protocol), a new browser API from the Google Chrome team.</p> <p>The Internet was built for humans, so navigating as an AI agent today is unreliable. WebMCP lets websites expose structured tools for AI agents to discover and call directly. Instead of slow screenshot-analyze-click loops, agents can call website functions like <code>searchFlights()</code> or <code>bookTicket()</code> with typed parameters, making browser automation faster, more reliable, and less fragile.</p> <img src="https://developers.cloudflare.com/images/browser-run/webMCP.gif" alt="Browser Run lab session showing WebMCP tools being discovered and executed in the Chrome DevTools console to book a hotel"> <p>With WebMCP, you can:</p> <ul> <li><strong>Discover website tools</strong> - Use <code>navigator.modelContextTesting.listTools()</code> to see available actions on any WebMCP-enabled site</li> <li><strong>Execute tools directly</strong> - Call <code>navigator.modelContextTesting.executeTool()</code> with typed parameters</li> <li><strong>Handle human-in-the-loop interactions</strong> - Some tools pause for user confirmation before completing sensitive actions</li> </ul> <p>WebMCP requires Chrome beta features. We have an experimental pool with browser instances running Chrome beta so you can test emerging browser features before they reach stable Chrome. To start a WebMCP session, add <code>lab=true</code> to your <code>/devtools/browser</code> request:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/devtools/browser?lab=true&amp;keep_alive=300000"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {api_token}"</span></span></code></pre></figure> <p>Combined with the recently launched <a href="https://developers.cloudflare.com/browser-run/cdp/">CDP endpoint</a>, AI agents can also use WebMCP. Connect an <a href="https://developers.cloudflare.com/browser-run/cdp/mcp-clients/">MCP client</a> to Browser Run via CDP, and your agent can discover and call website tools directly. Here's the same hotel booking demo, this time driven by an AI agent through OpenCode:</p> <img src="https://developers.cloudflare.com/images/browser-run/webMCPagent.gif" alt="Browser Run Live View showing an AI agent navigating a hotel booking site in real time"> <p>For a step-by-step guide, refer to the <a href="https://developers.cloudflare.com/browser-run/features/webmcp/">WebMCP documentation</a>.</p>Wed, 15 Apr 2026 10:00:00 GMTBrowser RunBrowser RunAccess - Independent MFA for Access applicationshttps://developers.cloudflare.com/changelog/post/2026-04-15-independent-mfa/https://developers.cloudflare.com/changelog/post/2026-04-15-independent-mfa/<p>Cloudflare Access now supports independent multi-factor authentication (MFA), allowing you to enforce MFA requirements without relying on your identity provider (IdP). With per-application and per-policy configuration, you can enforce stricter authentication methods like hardware security keys on sensitive applications without requiring them across your entire organization. This reduces the risk of MFA fatigue for your broader user population while adding additional security where it matters most.</p> <p>This feature also addresses common gaps in IdP-based MFA, such as inconsistent MFA policies across different identity providers or the need for additional security layers beyond what the IdP provides.</p> <p>Independent MFA supports the following authenticator types:</p> <ul> <li><strong>Authenticator application</strong> — Time-based one-time passwords (TOTP) using apps like Google Authenticator, Microsoft Authenticator, or Authy.</li> <li><strong>Security key</strong> — Hardware security keys such as YubiKeys.</li> <li><strong>Biometrics</strong> — Built-in device authenticators including Apple Touch ID, Apple Face ID, and Windows Hello.</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Infrastructure applications do not yet support independent MFA.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration-levels">Configuration levels</h4><a class="anchor-link" href="#configuration-levels"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can configure MFA requirements at three levels:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Level</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><strong>Organization</strong></td> <td>Enforce MFA by default for all applications in your account.</td> </tr> <tr> <td><strong>Application</strong></td> <td>Require or turn off MFA for a specific application.</td> </tr> <tr> <td><strong>Policy</strong></td> <td>Require or turn off MFA for users who match a specific policy.</td> </tr> </tbody> </table></div> <p>Settings at lower levels (policy) override settings at higher levels (organization), giving you granular control over MFA enforcement.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="user-enrollment">User enrollment</h4><a class="anchor-link" href="#user-enrollment"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Users enroll their authenticators through the <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/">App Launcher</a>. To help with onboarding, administrators can share a direct enrollment link: <code>&lt;your-team-name&gt;.cloudflareaccess.com/AddMfaDevice</code>.</p> <p>To get started with Independent MFA, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/">Independent MFA</a>.</p>Wed, 15 Apr 2026 00:00:00 GMTAccessAccessAgents - Agent Lee adds Write Operations and Generative UIhttps://developers.cloudflare.com/changelog/post/2026-04-15-agentlee-writeops-genui/https://developers.cloudflare.com/changelog/post/2026-04-15-agentlee-writeops-genui/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agent-lee-adds-write-operations-and-generative-ui">Agent Lee adds Write Operations and Generative UI</h4><a class="anchor-link" href="#agent-lee-adds-write-operations-and-generative-ui"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We are excited to announce two major capability upgrades for <strong>Agent Lee</strong>, the AI co-pilot built directly into the Cloudflare dashboard. Agent Lee is designed to understand your specific account configuration, and with this release, it moves from a passive advisor to an active assistant that can help you manage your infrastructure and visualize your data through natural language.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="take-action-with-write-operations">Take action with Write Operations</h4><a class="anchor-link" href="#take-action-with-write-operations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agent Lee can now perform changes on your behalf across your Cloudflare account. Whether you need to update DNS records, modify SSL/TLS settings, or configure Workers routes, you can simply ask.</p> <p>To ensure security and accuracy, every write operation requires <strong>explicit user approval</strong>. Before any change is committed, Agent Lee will present a summary of the proposed action in plain language. No action is taken until you select <strong>Confirm</strong>, and this approval requirement is enforced at the infrastructure level to prevent unauthorized changes.</p> <p><strong>Example requests:</strong></p> <ul> <li><em>"Add an A record for blog.example.com pointing to 192.0.2.10."</em></li> <li><em>"Enable Always Use HTTPS on my zone."</em></li> <li><em>"Set the SSL mode for example.com to Full (strict)."</em></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="visualize-data-with-generative-ui">Visualize data with Generative UI</h4><a class="anchor-link" href="#visualize-data-with-generative-ui"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Understanding your traffic and security trends is now as easy as asking a question. Agent Lee now features <strong>Generative UI</strong>, allowing it to render inline charts and structured data visualizations directly within the chat interface using your actual account telemetry.</p> <p><strong>Example requests:</strong></p> <ul> <li><em>"Show me a chart of my traffic over the last 7 days."</em></li> <li><em>"What does my error rate look like for the past 24 hours?"</em></li> <li><em>"Graph my cache hit rate for example.com this week."</em></li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>These features are currently available in <strong>Beta</strong> for all users on the <strong>Free plan</strong>. To get started, log in to the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> and select <strong>Ask AI</strong> in the upper right corner.</p> <p>To learn more about how to interact with your account using AI, refer to the <a href="https://developers.cloudflare.com/agent-lee/">Agent Lee documentation</a>.</p>Wed, 15 Apr 2026 00:00:00 GMTAgentsAgentsCloudflare One - New, streamlined creation experience for Access Applications and Gateway Policieshttps://developers.cloudflare.com/changelog/post/2026-04-15-new-rule-and-application-builders/https://developers.cloudflare.com/changelog/post/2026-04-15-new-rule-and-application-builders/<p>The Cloudflare One dashboard now features redesigned builders for two core workflows: creating Gateway policies and configuring self-hosted Access applications.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="gateway-rule-builder">Gateway rule builder</h4><a class="anchor-link" href="#gateway-rule-builder"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Gateway rule builder now features a redesigned user experience, bringing it in line with the Access policy builder experience. Improvements include:</p> <ul> <li><strong>Streamlined UX</strong> with clearer states and improved user interactions</li> <li><strong>Wirefilter editing</strong> for viewing and editing Gateway rules directly from wirefilter expressions</li> <li><strong>Preview state</strong> to review the impact of your policy in a simple graphic</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1280,height=1494,format=webp/_astro/gateway-rule-builder.BxvzsN8s.png" alt="New Gateway rule builder" loading="lazy" decoding="async" width="1280" height="1494"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Traffic policies</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="access-application-builder-for-self-hosted-apps">Access application builder for self-hosted apps</h4><a class="anchor-link" href="#access-application-builder-for-self-hosted-apps"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The self-hosted Access application builder now offers a simplified creation workflow with fewer steps from setup to save. Improvements include:</p> <ul> <li><strong>New application selection experience</strong> that makes choosing the right application type before you begin easier.</li> <li><strong>Streamlined creation flow</strong> with fewer clicks to build and save an application</li> <li><strong>Inline policy creation</strong> for building Access policies directly within the application creation flow</li> <li><strong>Preview state</strong> to understand how your policies enforce user access before saving</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1970,height=1104,format=webp/_astro/access-application-builder.B__yqGin.png" alt="New Access application builder" loading="lazy" decoding="async" width="1970" height="1104"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/">self-hosted applications</a>.</p>Wed, 15 Apr 2026 00:00:00 GMTCloudflare OneCloudflare OneDigital Experience Monitoring - Last seen timestamp for Cloudflare One Client devices is more consistenthttps://developers.cloudflare.com/changelog/post/2026-04-15-dex-consistent-last-seen-timestamps/https://developers.cloudflare.com/changelog/post/2026-04-15-dex-consistent-last-seen-timestamps/<p>The last seen timestamp for <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare One Client</a> devices is now more consistent across the dashboard. IT teams will see more consistent information about the most recent client event between a device and Cloudflare's network.</p>Wed, 15 Apr 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringLogs - New TenantID and Firewall for AI fields in Logpush datasetshttps://developers.cloudflare.com/changelog/post/2026-04-15-logpush-new-fields/https://developers.cloudflare.com/changelog/post/2026-04-15-logpush-new-fields/<p>Cloudflare has added new fields to multiple <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="tenantid-field">TenantID field</h4><a class="anchor-link" href="#tenantid-field"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following Gateway and Zero Trust datasets now include a <code>TenantID</code> field:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/#tenantid">Gateway DNS</a></strong>: Identifies the tenant ID of the DNS request, if it exists.</li> <li><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_http/#tenantid">Gateway HTTP</a></strong>: Identifies the tenant ID of the HTTP request, if it exists.</li> <li><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_network/#tenantid">Gateway Network</a></strong>: Identifies the tenant ID of the network session, if it exists.</li> <li><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/#tenantid">Zero Trust Network Sessions</a></strong>: Identifies the tenant ID of the network session, if it exists.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="firewall-for-ai-fields">Firewall for AI fields</h4><a class="anchor-link" href="#firewall-for-ai-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following datasets now include <a href="https://developers.cloudflare.com/api-shield/security/volumetric-abuse-detection/#firewall-for-ai">Firewall for AI</a> fields:</p> <ul> <li> <p><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/firewall_events/">Firewall Events</a></strong>:</p> <ul> <li><code>FirewallForAIInjectionScore</code>: The score indicating the likelihood of a prompt injection attack in the request.</li> <li><code>FirewallForAIPIICategories</code>: List of PII categories detected in the request.</li> <li><code>FirewallForAITokenCount</code>: The number of tokens in the request.</li> <li><code>FirewallForAIUnsafeTopicCategories</code>: List of unsafe topic categories detected in the request.</li> </ul> </li> <li> <p><strong><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/http_requests/">HTTP Requests</a></strong>:</p> <ul> <li><code>FirewallForAIInjectionScore</code>: The score indicating the likelihood of a prompt injection attack in the request.</li> <li><code>FirewallForAIPIICategories</code>: List of PII categories detected in the request.</li> <li><code>FirewallForAITokenCount</code>: The number of tokens in the request.</li> <li><code>FirewallForAIUnsafeTopicCategories</code>: List of unsafe topic categories detected in the request.</li> </ul> </li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Wed, 15 Apr 2026 00:00:00 GMTLogsLogsPrivacy Proxy - Privacy Proxy metrics now available via GraphQL Analytics APIhttps://developers.cloudflare.com/changelog/post/2026-04-15-graphql-analytics-api/https://developers.cloudflare.com/changelog/post/2026-04-15-graphql-analytics-api/<p>Privacy Proxy metrics are now queryable through Cloudflare's <a href="https://developers.cloudflare.com/privacy-proxy/reference/metrics/graphql/">GraphQL Analytics API</a>, the new default method for accessing Privacy Proxy observability data. All metrics are available through a single endpoint:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/graphql</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "query": "{ viewer { accounts(filter: { accountTag: $accountTag }) { privacyProxyRequestMetricsAdaptiveGroups(filter: { date_geq: $startDate, date_leq: $endDate }, limit: 10000, orderBy: [date_ASC]) { count dimensions { date } } } } }",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "variables": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "accountTag": "&lt;YOUR_ACCOUNT_TAG&gt;",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "startDate": "2026-04-04",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "endDate": "2026-04-06"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="available-nodes">Available nodes</h4><a class="anchor-link" href="#available-nodes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Four GraphQL nodes are now live, providing aggregate metrics across all key dimensions of your Privacy Proxy deployment:</p> <ul> <li><strong><code>privacyProxyRequestMetricsAdaptiveGroups</code></strong> — Request volume, error rates, status codes, and proxy status breakdowns.</li> <li><strong><code>privacyProxyIngressConnMetricsAdaptiveGroups</code></strong> — Client-to-proxy connection counts, bytes transferred, and latency percentiles.</li> <li><strong><code>privacyProxyEgressConnMetricsAdaptiveGroups</code></strong> — Proxy-to-origin connection counts, bytes transferred, and latency percentiles.</li> <li><strong><code>privacyProxyAuthMetricsAdaptiveGroups</code></strong> — Authentication attempt counts by method and result.</li> </ul> <p>All nodes support filtering by time, data center (<code>coloCode</code>), and endpoint, with additional node-specific dimensions such as transport protocol and authentication method.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-this-means-for-existing-opentelemetry-users">What this means for existing OpenTelemetry users</h4><a class="anchor-link" href="#what-this-means-for-existing-opentelemetry-users"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>OpenTelemetry-based metrics export remains available. The GraphQL Analytics API is now the recommended default method — a plug-and-play method that requires no collector infrastructure, saving engineering overhead.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/privacy-proxy/reference/metrics/graphql/">GraphQL Analytics API for Privacy Proxy</a></li> <li><a href="https://developers.cloudflare.com/analytics/graphql-api/getting-started/">GraphQL Analytics API — getting started</a></li> </ul>Wed, 15 Apr 2026 00:00:00 GMTPrivacy ProxyPrivacy ProxyWAF - WAF Release - 2026-04-15https://developers.cloudflare.com/changelog/post/2026-04-15-waf-release/https://developers.cloudflare.com/changelog/post/2026-04-15-waf-release/ <p>This week's release introduces a new detection for a critical Remote Code Execution (RCE) vulnerability in Mesop (CVE-2026-33057), alongside protections for high-impact vulnerabilities in Cisco Secure Firewall Management Center (CVE-2026-20079) and FortiClient EMS (CVE-2026-21643). Additionally, this release includes an update to our existing React Server DoS coverage to address recently identified resource exhaustion vectors (CVE-2026-23869).</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Cisco Secure FMC (CVE-2026-20079): A vulnerability in the web-based management interface of Cisco Secure Firewall Management Center (FMC) that allows an unauthenticated, remote attacker to execute arbitrary commands or bypass security filters.</p> </li> <li> <p>FortiClient EMS (CVE-2026-21643): A critical vulnerability in the FortiClient EMS permitting unauthorized access or administrative configuration manipulation via crafted HTTP requests.</p> </li> <li> <p>Mesop (CVE-2026-33057): A vulnerability in the Mesop Python-based UI framework where unauthenticated attackers can execute arbitrary code by sending specially crafted, Base64-encoded payloads in the request body.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of these vulnerabilities could allow unauthenticated attackers to execute arbitrary code, gain administrative control over network management infrastructure, or trigger server-side resource exhaustion. Administrators are strongly encouraged to apply official vendor updates.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7767165cda1841b8b6e5abb7aef9415b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...aef9415b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Cisco Secure FMC - RCE via upgradeReadinessCall - CVE:CVE-2026-20079</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3dd0b2b6f45c4bc08e49bf27ee7be621"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ee7be621</span></button></rule-id></td><td>N/A</td><td>FortiClient EMS - Pre-Auth SQL Injection - CVE:CVE-2026-21643</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0e3a6828906c4b24bad318a9c953a72b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c953a72b</span></button></rule-id></td><td>N/A</td><td>Mesop - Remote Code Execution - Base64 Payload - CVE:CVE-2026-33057</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d95aa5410d1b4e98bf7a59d150c08f6f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...50c08f6f</span></button></rule-id></td><td>N/A</td><td>React Server - DOS - CVE:CVE-2026-23864 - 1 - Beta</td><td>Log</td><td>Block</td><td>This rule has been merged into the original rule "React Server - DOS - CVE:CVE-2026-23864 - 1" (ID: <rule-id id="aaede80b4d414dc89c443cea61680354"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...61680354</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7d6757e8a28f4853a72b4ce6ebd81645"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ebd81645</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Link Tag - URI (beta)</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5e69d599ad634c81abe36a5f0af34bba"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0af34bba</span></button></rule-id></td><td>N/A</td><td>XSS, HTML Injection - Embed Tag - URI (beta)</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr></tbody></table>Wed, 15 Apr 2026 00:00:00 GMTWAFWAFData Loss Prevention - DLP account-level settingshttps://developers.cloudflare.com/changelog/post/2025-04-14-account-level-dlp-settings/https://developers.cloudflare.com/changelog/post/2025-04-14-account-level-dlp-settings/<p><strong>Account-level DLP settings are now available</strong> in Cloudflare One. You can now configure advanced DLP settings at the account level, including OCR, AI context analysis, and payload masking. This provides consistent enforcement across all DLP profiles and simplifies configuration management.</p> <p>Key changes:</p> <ul> <li><strong>Consistent enforcement</strong>: Settings configured at the account level apply to all DLP profiles</li> <li><strong>Simplified migration</strong>: Settings enabled on any profile are automatically migrated to account level</li> <li><strong>Deprecation notice</strong>: Profile-level advanced settings will be deprecated in a future release</li> </ul> <p><strong>Migration details:</strong></p> <p>During the migration period, if a setting is enabled on any profile, it will automatically be enabled at the account level. This means profiles that previously had a setting disabled may now have it enabled if another profile in the account had it enabled.</p> <p>Settings are evaluated using OR logic - a setting is enabled if it is turned on at either the account level or the profile level. However, profile-level settings cannot be enabled when the account-level setting is off.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-settings/">DLP settings documentation</a>.</p>Tue, 14 Apr 2026 12:00:00 GMTData Loss PreventionData Loss PreventionBrowser Run - Manage Browser Rendering sessions with Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-04-14-browser-wrangler-commands/https://developers.cloudflare.com/changelog/post/2026-04-14-browser-wrangler-commands/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> now supports <code>wrangler browser</code> commands, letting you create, manage, and view browser sessions directly from your terminal, streamlining your workflow. Since Wrangler handles authentication, you do not need to pass API tokens in your commands.</p> <p>The following commands are available:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>wrangler browser create</code></td> <td>Create a new browser session</td> </tr> <tr> <td><code>wrangler browser close</code></td> <td>Close a session</td> </tr> <tr> <td><code>wrangler browser list</code></td> <td>List active sessions</td> </tr> <tr> <td><code>wrangler browser view</code></td> <td>View a live browser session</td> </tr> </tbody> </table></div> <p>The <code>create</code> command spins up a browser instance on Cloudflare's network and returns a session URL. Once created, you can connect to the session using any <a href="https://developers.cloudflare.com/browser-run/cdp/">CDP</a>-compatible client like <a href="https://developers.cloudflare.com/browser-run/cdp/puppeteer/">Puppeteer</a>, <a href="https://developers.cloudflare.com/browser-run/cdp/playwright/">Playwright</a>, or <a href="https://developers.cloudflare.com/browser-run/cdp/mcp-clients/">MCP clients</a> to automate browsing, scrape content, or debug remotely.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> browser</span><span class="nb-shiki-mdbnqw"> create</span></span></code></pre></figure> <p>Use <code>--keepAlive</code> to set the session keep-alive duration (60-600 seconds):</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> browser</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-dzsirb"> --keepAlive</span><span class="nb-shiki-dzsirb"> 300</span></span></code></pre></figure> <p>The <code>view</code> command auto-selects when only one session exists, or prompts for selection when multiple sessions are available.</p> <p>All commands support <code>--json</code> for structured output, and because these are CLI commands, you can incorporate them into scripts to automate session management.</p> <p>For full usage details, refer to the <a href="https://developers.cloudflare.com/browser-run/reference/wrangler-commands/">Wrangler commands documentation</a>.</p>Tue, 14 Apr 2026 00:00:00 GMTBrowser RunBrowser RunCloudflare One - Introducing Cloudflare Meshhttps://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-mesh/https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-mesh/<p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> is now available (<a href="https://blog.cloudflare.com/mesh/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>). Mesh connects your services and devices with post-quantum encrypted networking, allowing you to route traffic privately between servers, laptops, and phones over TCP, UDP, and ICMP.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2070,height=875,format=webp/_astro/mesh-network-map.CED6jNHK.gif" alt="Cloudflare Mesh network map showing nodes and devices connected through Cloudflare" loading="lazy" decoding="async" width="2070" height="875"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-cloudflare-mesh-does">What Cloudflare Mesh does</h4><a class="anchor-link" href="#what-cloudflare-mesh-does"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Assigns a private <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/#mesh-ips">Mesh IP</a> to every enrolled device and node.</li> <li>Enables any participant to reach any other participant by IP — including client-to-client, without deploying any infrastructure.</li> <li>Supports <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/">CIDR routes</a> for subnet routing through Mesh nodes.</li> <li>Supports <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/">high availability</a> with active-passive replicas for nodes with routes.</li> <li>All traffic flows through Cloudflare, so <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Gateway network policies</a>, <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/">device posture checks</a>, and access rules apply to every connection.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>WARP Connector</strong> is now <strong>Cloudflare Mesh</strong>. Existing WARP Connectors are now called mesh nodes. All existing deployments continue to work — no migration required.</li> <li><strong>Peer-to-peer connectivity</strong> is now called <strong>Mesh connectivity</strong> and is part of the Cloudflare Mesh documentation.</li> <li><strong>Mesh node limit</strong> increased from 10 to <strong>50 per account</strong>.</li> <li>New <a href="https://dash.cloudflare.com/?to=/:account/mesh" target="_blank" rel="noopener">dashboard experience<span class="external-link"> ↗</span></a> at <strong>Networking</strong> &gt; <strong>Mesh</strong> with an interactive network map, node management, route configuration, diagnostics, and a setup wizard.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Refer to the <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh documentation</a> to set up your first Mesh network.</p>Tue, 14 Apr 2026 00:00:00 GMTCloudflare OneCloudflare OneData Loss Prevention - Detect Cloudflare API tokens with DLPhttps://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-api-token-detections/https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-api-token-detections/<p>The <strong>Credentials and Secrets</strong> DLP profile now includes three new predefined entries for detecting Cloudflare API credentials:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Entry name</th> <th>Token prefix</th> <th>Detects</th> </tr> </thead> <tbody> <tr> <td>Cloudflare User API Key</td> <td><code>cfk_</code></td> <td>User-scoped API keys</td> </tr> <tr> <td>Cloudflare User API Token</td> <td><code>cfut_</code></td> <td>User-scoped API tokens</td> </tr> <tr> <td>Cloudflare Account Owned API Token</td> <td><code>cfat_</code></td> <td>Account-scoped API tokens</td> </tr> </tbody> </table></div> <p>These detections target the new <a href="https://developers.cloudflare.com/fundamentals/api/get-started/token-formats/">Cloudflare API credential format</a>, which uses a structured prefix and a CRC32 checksum suffix. The identifiable prefix makes it possible to detect leaked credentials with high confidence and low false positive rates — no surrounding context such as <code>Authorization: Bearer</code> headers is required.</p> <p>Credentials generated before this format change will not be matched by these entries.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-enable-cloudflare-api-token-detections">How to enable Cloudflare API token detections</h4><a class="anchor-link" href="#how-to-enable-cloudflare-api-token-detections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>In the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Zero Trust</strong> &gt; <strong>DLP</strong> &gt; <strong>DLP Profiles</strong>.</li> <li>Select the <strong>Credentials and Secrets</strong> profile.</li> <li>Turn on one or more of the new Cloudflare API token entries.</li> <li>Use the profile in a Gateway HTTP policy to log or block traffic containing these credentials.</li> </ol> <p>Example policy:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Selector</th> <th>Operator</th> <th>Value</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td>DLP Profile</td> <td>in</td> <td><em>Credentials and Secrets</em></td> <td>Block</td> </tr> </tbody> </table></div> <p>You can also enable individual entries to scope detection to specific credential types — for example, enabling <strong>Account Owned API Token</strong> detection without enabling <strong>User API Key</strong> detection.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/">predefined DLP profiles</a>.</p>Tue, 14 Apr 2026 00:00:00 GMTData Loss PreventionData Loss PreventionGateway, Data Loss Prevention - Configure how sensitive data appears in DLP payload logshttps://developers.cloudflare.com/changelog/post/2026-04-14-configurable-payload-log-masking/https://developers.cloudflare.com/changelog/post/2026-04-14-configurable-payload-log-masking/<p>You can now configure how sensitive data matches are displayed in your DLP payload match logs — giving your incident response team the context they need to validate alerts without compromising your security posture.</p> <p>To get started, go to the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, select <strong>Zero Trust</strong> &gt; <strong>Data loss prevention</strong> &gt; <strong>DLP settings</strong> and find the <strong>Payload log masking</strong> card.</p> <p>Previously, all DLP payload logs used a single masking mode that obscured matched data entirely and hid the original character count, making it difficult to distinguish true positives from false positives. This update introduces three options:</p> <ul> <li><strong>Full Mask (default):</strong> Masks the match while preserving character count and visual formatting (for example, <code>***-**-****</code> for a Social Security Number). This is an improvement over the previous default, which did not preserve character count.</li> <li><strong>Partial Mask:</strong> Reveals 25% of the matched content while masking the remainder (for example, <code>***-**-6789</code>).</li> <li><strong>Clear Text:</strong> Stores the full, unmasked violation for deep investigation (for example, <code>123-45-6789</code>).</li> </ul> <p><strong>Important:</strong> The masking level you select is applied at detection time, before the payload is encrypted. This means the chosen format is what your team will see after decrypting the log with your private key — the existing encryption workflow is unchanged.</p> <p><strong>Applies to all enabled detections:</strong> When a masking level other than Full Mask is selected, it applies to all sensitive data matches found within a payload window — not just the match that triggered the policy. Any data matched by your enabled DLP detection entries will be masked at the selected level.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-policies/logging-options/#log-the-payload-of-matched-rules">DLP logging options</a>.</p>Tue, 14 Apr 2026 00:00:00 GMTGatewayGatewayData Loss PreventionCloudflare Fundamentals - Improved OAuth experience for consent and managementhttps://developers.cloudflare.com/changelog/post/2026-04-14-oauth-consent-and-revoke/https://developers.cloudflare.com/changelog/post/2026-04-14-oauth-consent-and-revoke/<p>OAuth allows third-party applications to access your Cloudflare account on your behalf — like when Wrangler deploys Workers or when monitoring tools read your analytics. You now have <strong>granular control</strong> over which accounts these applications can access, plus the ability to revoke access anytime.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="choose-which-accounts-to-authorize">Choose which accounts to authorize</h4><a class="anchor-link" href="#choose-which-accounts-to-authorize"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When authorizing an OAuth application, you can now <strong>select specific accounts</strong> instead of granting access to all your accounts:</p> <ul> <li><strong>Account-by-account selection</strong> — Choose exactly which accounts the application can access</li> <li><strong>"All accounts" option</strong> — Still available for trusted tools like Wrangler This gives you precise control who can access your data.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="clear-consent-screens">Clear consent screens</h4><a class="anchor-link" href="#clear-consent-screens"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The OAuth consent screen now shows:</p> <ul> <li><strong>What the application can access</strong> — Explicit list of permissions being requested</li> <li><strong>Who created the application</strong> — Application owner and contact information</li> <li><strong>Which accounts you're authorizing</strong> — Checkboxes for account selection</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="revoke-access-anytime">Revoke access anytime</h4><a class="anchor-link" href="#revoke-access-anytime"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Manage authorized OAuth applications from your profile:</p> <ul> <li><strong>See all connected apps</strong> — View every OAuth application with access to your accounts</li> <li><strong>Review permissions and scope</strong> — Check what each application can do and which accounts it can access</li> <li><strong>Revoke instantly</strong> — Remove access with one click when you no longer need it To manage your OAuth applications, navigate to <strong>Profile</strong> &gt; <strong>Access Management</strong> &gt; <strong><a href="https://dash.cloudflare.com/profile/access-management/authorization" target="_blank" rel="noopener">Connected Applications<span class="external-link"> ↗</span></a></strong>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>These updates give you:</p> <ul> <li><strong>Granular control</strong> — Authorize apps per-account instead of all-or-nothing</li> <li><strong>Transparency</strong> — Know exactly what you're authorizing before you consent</li> <li><strong>Security</strong> — Limit blast radius by restricting access to only necessary accounts</li> <li><strong>Easy cleanup</strong> — Revoke access when applications are no longer needed</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Read more about these improvements in our blog post: <a href="https://blog.cloudflare.com/improved-developer-security/#improving-the-oauth-consent-experience" target="_blank" rel="noopener">Improving the OAuth consent experience<span class="external-link"> ↗</span></a>.</p>Tue, 14 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare Fundamentalslogpush, Logs - Logpush to BigQuery — Cloudflare dashboard supporthttps://developers.cloudflare.com/changelog/post/2026-04-14-bigquery-dashboard-support/https://developers.cloudflare.com/changelog/post/2026-04-14-bigquery-dashboard-support/<p>You can now configure Logpush jobs to Google BigQuery directly from the Cloudflare dashboard, in addition to the existing API-based setup.</p> <p>Previously, setting up a BigQuery Logpush destination required using the Logpush API. Now you can create and manage BigQuery Logpush jobs from the <strong>Logpush</strong> page in the Cloudflare dashboard by selecting <strong>Google BigQuery</strong> as the destination and entering your Google Cloud project ID, dataset ID, table ID, and service account credentials.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/bigquery/">Enable Logpush to Google BigQuery</a>.</p>Tue, 14 Apr 2026 00:00:00 GMTlogpushlogpushLogsRadar - Generate citations on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-04-14-radar-citations/https://developers.cloudflare.com/changelog/post/2026-04-14-radar-citations/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> shareable widgets now include a <strong>generate citation</strong> action, making it easier to reference <a href="https://radar.cloudflare.com" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a> data in research papers and other publications.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=548,height=308,format=webp/_astro/citation-action-icon.B2QPGPhA.png" alt="Screenshot of the generate citation icon in the widget action bar" loading="lazy" decoding="async" width="548" height="308"> <p>Select the citation icon to open a modal with five supported citation styles:</p> <ul> <li><strong>BibTeX</strong></li> <li><strong>APA</strong></li> <li><strong>MLA</strong></li> <li><strong>Chicago</strong></li> <li><strong>RIS</strong></li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1432,height=800,format=webp/_astro/citation-modal.Bf5eDHwO.png" alt="Screenshot of the citation modal with format options" loading="lazy" decoding="async" width="1432" height="800"> <p>Explore the feature on any shareable widget at <a href="https://radar.cloudflare.com" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a>.</p>Tue, 14 Apr 2026 00:00:00 GMTRadarRadarWAF - Email obfuscation decode script is now non-render-blockinghttps://developers.cloudflare.com/changelog/post/2026-04-14-email-obfuscation-defer/https://developers.cloudflare.com/changelog/post/2026-04-14-email-obfuscation-defer/<p>The decode script injected by <a href="https://developers.cloudflare.com/waf/tools/scrape-shield/email-address-obfuscation/">Email Address Obfuscation</a> now loads with the <code>defer</code> attribute. This means the script no longer blocks page rendering. It downloads in parallel with HTML parsing and executes after the document is fully parsed, before the <code>DOMContentLoaded</code> event.</p> <p>This improves page loading performance, contributing to better Core Web Vitals, for all zones with Email Address Obfuscation on. No action is required.</p> <p>If you have custom JavaScript that depends on email addresses being decoded at a specific point during page load, note that the decode script now executes after HTML parsing completes rather than inline during parsing.</p>Tue, 14 Apr 2026 00:00:00 GMTWAFWAFWorkers VPC - VPC Networks and Cloudflare Mesh support now in public betahttps://developers.cloudflare.com/changelog/post/2026-04-14-vpc-networks/https://developers.cloudflare.com/changelog/post/2026-04-14-vpc-networks/ <p><a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Network</a> bindings now give your Workers access to any service in your private network without pre-registering individual hosts or ports. This complements existing <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/">VPC Service</a> bindings, which scope each binding to a specific host and port.</p> <p>You can bind to a <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> by <code>tunnel_id</code> to reach any service on the network where that tunnel is running, or bind to your <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">Cloudflare Mesh</a> network using <code>cf1:network</code> to reach any Mesh node, client device, or subnet route in your account:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "vpc_networks"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MESH"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "network_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf1:network"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">vpc_networks</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"MESH"</span></span> <span class="line"><span class="nb-shiki-140thh">network_id = </span><span class="nb-shiki-mdbnqw">"cf1:network"</span></span> <span class="line"><span class="nb-shiki-140thh">remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>At runtime, <code>fetch()</code> routes through the network to reach the service at the IP and port you specify:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MESH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://10.0.1.50:8080/api/data"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>For configuration options and examples, refer to <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/">VPC Networks</a> and <a href="https://developers.cloudflare.com/workers-vpc/examples/connect-to-cloudflare-mesh/">Connect Workers to Cloudflare Mesh</a>.</p>Tue, 14 Apr 2026 00:00:00 GMTWorkers VPCWorkers VPCContainers - Containers and Sandboxes are now generally availablehttps://developers.cloudflare.com/changelog/post/2026-04-13-containers-sandbox-ga/https://developers.cloudflare.com/changelog/post/2026-04-13-containers-sandbox-ga/<p>Cloudflare <a href="https://developers.cloudflare.com/containers/">Containers</a> and <a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> are now generally available.</p> <p>Containers let you run more workloads on the Workers platform, including resource-intensive applications, different languages, and CLI tools that need full Linux environments.</p> <p>Since the initial launch of Containers, there have been significant improvements to Containers' performance, stability, and feature set. Some highlights include:</p> <ul> <li><a href="https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/">Higher limits</a> allow you to run thousands of containers concurrently.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/">Active-CPU pricing</a> means that you only pay for used CPU cycles.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/">Easy connections to Workers and other bindings</a> via hostnames help you extend your Containers with additional functionality.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/">Docker Hub support</a> makes it easy to use your existing images and registries.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/">SSH support</a> helps you access and debug issues in live containers.</li> </ul> <p>The <a href="https://developers.cloudflare.com/sandbox/">Sandbox SDK</a> provides isolated environments for running untrusted code securely, with a simple TypeScript API for executing commands, managing files, and exposing services. This makes it easier to secure and manage your agents at scale. Some additions since launch include:</p> <ul> <li><a href="https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/">Live preview URLs</a> so agents can run long-lived services and verify in-flight changes.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/">Persistent code interpreters</a> for Python, JavaScript, and TypeScript, with rich structured outputs.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/">Interactive PTY terminals</a> for real browser-based terminal access with multiple isolated shells per sandbox.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/">Backup and restore APIs</a> to snapshot a workspace and quickly restore an agent's coding session without repeating expensive setup steps.</li> <li><a href="https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/">Real-time filesystem watching</a> so apps and agents can react immediately to file changes inside a sandbox.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/containers/">Containers</a> and <a href="https://developers.cloudflare.com/sandbox/">Sandbox SDK</a> documentation.</p>Mon, 13 Apr 2026 00:00:00 GMTContainersContainersContainers, Agents - Secure credential injection and dynamic egress policies for Sandboxeshttps://developers.cloudflare.com/changelog/post/2026-04-13-sandbox-outbound-workers-tls-auth/https://developers.cloudflare.com/changelog/post/2026-04-13-sandbox-outbound-workers-tls-auth/<p>Outbound Workers for <a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> and <a href="https://developers.cloudflare.com/containers/">Containers</a> now support zero-trust credential injection, TLS interception, allow/deny lists, and dynamic per-instance egress policies. These features give platforms running agentic workloads full control over what leaves the sandbox, without exposing secrets to untrusted workloads, like user-generated code or coding agents.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="credential-injection">Credential injection</h4><a class="anchor-link" href="#credential-injection"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Because outbound handlers run in the Workers runtime, outside the sandbox, they can hold secrets the sandbox never sees. A sandboxed workload can make a plain request, and credentials are transparently attached before a request is forwarded upstream.</p> <p>For instance, you could run an agent in a sandbox and ensure that any requests it makes to Github are authenticated. But it will never be able to access the credentials:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MySandbox</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Sandbox</span><span class="nb-shiki-140thh"> {}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MySandbox.outboundByHost </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "github.com"</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> OutboundHandlerContext</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> requestWithAuth</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> requestWithAuth.headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"x-auth-token"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">SECRET</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(requestWithAuth);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>You can easily inject unique credentials for different instances by using <code>ctx.containerId</code>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-140thh">MySandbox.outboundByHost </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "my-internal-vcs.dev"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1jdh33"> request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> OutboundHandlerContext</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> authKey</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">KEYS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(ctx.containerId);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> requestWithAuth</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> requestWithAuth.headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"x-auth-token"</span><span class="nb-shiki-140thh">, authKey);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(requestWithAuth);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>No token is ever passed into the sandbox. You can rotate secrets in the Worker environment and every request will pick them up immediately.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="tls-interception">TLS interception</h4><a class="anchor-link" href="#tls-interception"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Outbound Workers now intercept HTTPS traffic. A unique ephemeral certificate authority (CA) and private key are created for each sandbox instance. The CA is placed into the sandbox and trusted by default. The ephemeral private key never leaves the container runtime sidecar process and is never shared across instances.</p> <p>With TLS interception active, outbound Workers can act as a transparent proxy for both HTTP and HTTPS traffic.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="allow-and-deny-hosts">Allow and deny hosts</h4><a class="anchor-link" href="#allow-and-deny-hosts"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Easily filter outbound traffic with <code>allowedHosts</code> and <code>deniedHosts</code>. When <code>allowedHosts</code> is set, it becomes a deny-by-default allowlist. Both properties support glob patterns.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MySandbox</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Sandbox</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> allowedHosts</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-mdbnqw">"github.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"npmjs.org"</span><span class="nb-shiki-140thh">];</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dynamic-outbound-handlers">Dynamic outbound handlers</h4><a class="anchor-link" href="#dynamic-outbound-handlers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Define named outbound handlers then apply or remove them at runtime using <code>setOutboundHandler()</code> or <code>setOutboundByHost()</code>. This lets you change egress policy for a running sandbox without restarting it.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MySandbox</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Sandbox</span><span class="nb-shiki-140thh"> {}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MySandbox.outboundHandlers </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> allowHosts</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> OutboundHandlerContext</span><span class="nb-shiki-140thh"> ) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> url</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(req.url);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (ctx.params.allowedHostnames.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(url.hostname)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(req);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">403</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> noHttp</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">403</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Apply handlers programmatically from your Worker:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> sandbox</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getSandbox</span><span class="nb-shiki-140thh">(env.Sandbox, userId);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Open network for setup</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">setOutboundHandler</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"allowHosts"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> allowedHostnames: [</span><span class="nb-shiki-mdbnqw">"github.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"npmjs.org"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"npm install"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Lock down after setup</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">setOutboundHandler</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"noHttp"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Handlers accept <code>params</code>, so you can customize behavior per instance without defining separate handler functions.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Upgrade to <code>@cloudflare/containers@0.3.0</code> or <code>@cloudflare/sandbox@0.8.9</code> to use these features.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/sandbox/guides/outbound-traffic/">Sandbox outbound traffic</a> and <a href="https://developers.cloudflare.com/containers/platform-details/outbound-traffic/">Container outbound traffic</a>.</p>Mon, 13 Apr 2026 00:00:00 GMTContainersContainersAgentsWorkers - Local Explorer for local resource datahttps://developers.cloudflare.com/changelog/post/2026-04-13-local-explorer/https://developers.cloudflare.com/changelog/post/2026-04-13-local-explorer/<p>Local Explorer is a browser-based interface and REST API for viewing and editing local resource data during development. It removes the need to write throwaway scripts or dig through <code>.wrangler/state</code> to understand what data your Worker has stored locally.</p> <p>Local Explorer is available in Wrangler 4.82.1+ and the Cloudflare Vite plugin 1.32.0+. Start a local development session and press <code>e</code> in your terminal, or navigate to <code>/cdn-cgi/explorer</code> on your local dev server.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="supported-resources">Supported resources</h4><a class="anchor-link" href="#supported-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Local Explorer supports five resource types and works across multiple workers running locally:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/kv/">KV</a></strong> — Browse keys, view values and metadata, create, update, and delete key-value pairs.</li> <li><strong><a href="https://developers.cloudflare.com/r2/">R2</a></strong> — List objects, view metadata, upload files, and delete objects. Supports directory views and multi-select.</li> <li><strong><a href="https://developers.cloudflare.com/d1/">D1</a></strong> — Browse tables and rows, run arbitrary SQL queries, and edit schemas in a full data studio.</li> <li><strong><a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a></strong> (SQLite storage) — Browse individual object SQLite tables, run SQL queries, and edit schemas.</li> <li><strong><a href="https://developers.cloudflare.com/workflows/">Workflows</a></strong> — List instances, view status and step history, trigger new runs, and pause, resume, restart, or terminate instances.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="openapi-powered-rest-api">OpenAPI-powered REST API</h4><a class="anchor-link" href="#openapi-powered-rest-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Local Explorer exposes a REST API at <code>/cdn-cgi/explorer/api</code> that provides programmatic access to the same operations available in the browser. The root endpoint returns an <a href="https://www.openapis.org/" target="_blank" rel="noopener">OpenAPI specification<span class="external-link"> ↗</span></a> describing all available endpoints, parameters, and response formats.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> http://localhost:8787/cdn-cgi/explorer/api</span></span></code></pre></figure> <p>Point an AI coding agent at <code>/cdn-cgi/explorer/api</code> and it can discover and interact with your local resources without manual setup. This enables iterative development loops where an agent can populate test data in KV or D1, inspect Durable Object state, trigger Workflow runs, or upload files to R2.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/workers/local-development/local-explorer/">Local Explorer documentation</a>.</p>Mon, 13 Apr 2026 00:00:00 GMTWorkersWorkersBrowser Isolation - Canvas Remoting optimizes performance for productivity applicationshttps://developers.cloudflare.com/changelog/post/2026-04-10-canvas-remoting-performance/https://developers.cloudflare.com/changelog/post/2026-04-10-canvas-remoting-performance/<p>Remote Browser Isolation now supports <strong>Canvas Remoting</strong>, improving performance for HTML5 Canvas applications by sending vector draw commands instead of rasterized bitmaps.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-improvements">Key improvements</h4><a class="anchor-link" href="#key-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>10x bandwidth reduction:</strong> Microsoft Word and other Office apps use 90% less bandwidth</li> <li><strong>Smooth performance:</strong> Google Sheets maintains consistent 30fps rendering</li> <li><strong>Responsive terminals:</strong> Web-based development environments and AI notebooks work in real-time</li> <li><strong>Zero configuration:</strong> Enabled by default for all Browser Isolation customers</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Instead of sending rasterized bitmaps for every Canvas update, Browser Isolation now:</p> <ol> <li>Captures Canvas draw commands at the source</li> <li>Converts them to lightweight vector instructions</li> <li>Renders Canvas content on the client</li> </ol> <p>This reduces bandwidth from hundreds of kilobytes per second to tens of kilobytes per second.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="managing-canvas-remoting">Managing Canvas Remoting</h4><a class="anchor-link" href="#managing-canvas-remoting"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To temporarily disable for troubleshooting:</p> <ul> <li>Right-click the isolated webpage background</li> <li>Select <strong>Disable Canvas Remoting</strong></li> <li>Re-enable the same way by selecting <strong>Enable Canvas Remoting</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="limitations">Limitations</h4><a class="anchor-link" href="#limitations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Currently supports 2D Canvas contexts only. WebGL and 3D graphics applications continue using bitmap rendering. For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/canvas-remoting/">Canvas Remoting</a>.</p>Fri, 10 Apr 2026 00:00:00 GMTBrowser IsolationBrowser IsolationBrowser Run - Browser Rendering adds Chrome DevTools Protocol (CDP) and MCP client supporthttps://developers.cloudflare.com/changelog/post/2026-04-10-browser-rendering-cdp-endpoint/https://developers.cloudflare.com/changelog/post/2026-04-10-browser-rendering-cdp-endpoint/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> now exposes the <a href="https://developers.cloudflare.com/browser-run/cdp/">Chrome DevTools Protocol (CDP)</a>, the low-level protocol that powers browser automation. The growing ecosystem of CDP-based agent tools, along with existing CDP automation scripts, can now use Browser Rendering directly.</p> <p>Any CDP-compatible client, including <a href="https://developers.cloudflare.com/browser-run/cdp/puppeteer/">Puppeteer</a> and <a href="https://developers.cloudflare.com/browser-run/cdp/playwright/">Playwright</a>, can connect from any environment, whether that is <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>, your local machine, or a cloud environment. All you need is your Cloudflare API key.</p> <p>For any existing CDP script, switching to Browser Rendering is a one-line change:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> puppeteer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> require</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"puppeteer-core"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> browser</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> puppeteer.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> browserWSEndpoint: </span><span class="nb-shiki-mdbnqw">`wss://api.cloudflare.com/client/v4/accounts/${</span><span class="nb-shiki-dzsirb">ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">}/browser-rendering/devtools/browser?keep_alive=600000`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { Authorization: </span><span class="nb-shiki-mdbnqw">`Bearer ${</span><span class="nb-shiki-dzsirb">API_TOKEN</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> page</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">newPage</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">goto</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://example.com"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">title</span><span class="nb-shiki-140thh">());</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <p>Additionally, MCP clients like Claude Desktop, Claude Code, Cursor, and OpenCode can now use Browser Rendering as their remote browser via the <a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank" rel="noopener">chrome-devtools-mcp<span class="external-link"> ↗</span></a> package.</p> <p>Here is an example of how to configure Browser Rendering for Claude Desktop:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mcpServers"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "browser-rendering"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "command"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"npx"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "args"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "-y"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "chrome-devtools-mcp@latest"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "--wsEndpoint=wss://api.cloudflare.com/client/v4/accounts/&lt;ACCOUNT_ID&gt;/browser-rendering/devtools/browser?keep_alive=600000"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "--wsHeaders={</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">Authorization</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">:</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">Bearer &lt;API_TOKEN&gt;</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">}"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>To get started, refer to the <a href="https://developers.cloudflare.com/browser-run/cdp/">CDP documentation</a>.</p>Fri, 10 Apr 2026 00:00:00 GMTBrowser RunBrowser RunCloudflare Fundamentals - API tokens now detectable by secret scanning toolshttps://developers.cloudflare.com/changelog/post/2026-04-10-secret-scanning-support/https://developers.cloudflare.com/changelog/post/2026-04-10-secret-scanning-support/<p>Cloudflare API tokens now include <strong>identifiable patterns</strong> that enable secret scanning tools to automatically detect them when leaked in code repositories, configuration files, or other public locations.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>API tokens generated by Cloudflare now follow a standardized format that secret scanning tools can recognize. When a Cloudflare token is accidentally committed to GitHub, GitLab, or another platform with secret scanning enabled, the tool will flag it and alert you.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Leaked credentials are a common security risk. By making Cloudflare tokens detectable by scanning tools, you can:</p> <ul> <li><strong>Detect leaks faster</strong> — Get notified immediately when a token is exposed.</li> <li><strong>Reduce risk window</strong> — Exposed tokens are deactivated immediately, before they can be exploited.</li> <li><strong>Automate security</strong> — Leverage existing secret scanning infrastructure without additional configuration.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-happens-when-a-leak-is-detected">What happens when a leak is detected</h4><a class="anchor-link" href="#what-happens-when-a-leak-is-detected"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When a third-party secret scanning tool detects a leaked Cloudflare API token:</p> <ol> <li><strong>Cloudflare immediately deactivates the token</strong> to prevent unauthorized access.</li> <li><strong>The token creator receives an email notification</strong> alerting them to the leak.</li> <li><strong>The token is marked as "Exposed"</strong> in the Cloudflare dashboard.</li> <li><strong>You can then roll or delete the token</strong> from the token management pages.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="supported-platforms">Supported platforms</h4><a class="anchor-link" href="#supported-platforms"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>GitHub Secret Scanning</strong> — Automatically enabled for public repositories</li> </ul> <p>For more information on token formats and secret scanning, refer to <a href="https://developers.cloudflare.com/fundamentals/api/get-started/token-formats/">API token formats</a>.</p>Fri, 10 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCASB - Send CASB posture finding instances with webhookshttps://developers.cloudflare.com/changelog/post/2026-04-09-casb-webhooks/https://developers.cloudflare.com/changelog/post/2026-04-09-casb-webhooks/<p>You can now use <strong>CASB webhooks</strong> in Cloudflare One to send posture finding instances to external systems such as chat platforms, ticketing systems, SIEMs, SOAR tools, and custom automation services.</p> <p>This gives security teams a simple way to route CASB posture findings into the tools and workflows they already use for triage and response.</p> <p>To get started, go to <strong>Integrations</strong> &gt; <strong>Webhooks</strong> in the Cloudflare One dashboard to create a webhook destination. After you configure a webhook, open a posture finding instance and select <strong>Send webhook</strong> to send it.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Flexible authentication</strong> — Configure destinations using <strong>None</strong>, <strong>Basic Auth</strong>, <strong>Bearer Auth</strong>, <strong>Static Headers</strong>, or <strong>HMAC-Signing</strong>.</li> <li><strong>Built-in testing</strong> — Use <strong>Test delivery</strong> to send a test request before sending a live finding instance.</li> <li><strong>Posture finding workflows</strong> — Send posture finding instances directly from the finding details workflow in <strong>Cloud &amp; SaaS findings</strong>.</li> <li><strong>HTTPS destinations</strong> — Configure webhook destinations with public <code>https://</code> URLs.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Configure <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/webhooks/">CASB webhooks</a> in Cloudflare.</li> <li>Learn how to <a href="https://developers.cloudflare.com/cloudflare-one/cloud-and-saas-findings/manage-findings/">manage findings</a> in Cloudflare.</li> </ul> <p>CASB webhooks are now available in Cloudflare One.</p>Thu, 09 Apr 2026 00:00:00 GMTCASBCASBWorkers - Relaxed simultaneous connection limiting for Workershttps://developers.cloudflare.com/changelog/post/2026-04-09-relaxed-connection-limiting/https://developers.cloudflare.com/changelog/post/2026-04-09-relaxed-connection-limiting/<p>The <a href="https://developers.cloudflare.com/workers/platform/limits/#simultaneous-open-connections">simultaneous open connections limit</a> has been relaxed. Previously, each Worker invocation was limited to six open connections at a time for the entire lifetime of each connection, including while reading the response body. Now, a connection is freed as soon as response headers arrive, so the six-connection limit only constrains how many connections can be in the initial "waiting for headers" phase simultaneously.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-new-connections-are-blocked-until-an-earlier-connection-fully-completes">Before: New connections are blocked until an earlier connection fully completes</h4><a class="anchor-link" href="#before-new-connections-are-blocked-until-an-earlier-connection-fully-completes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=500,format=svg/_astro/connection-limit-before.BYti-Sxe.svg" alt="A 7th fetch is queued until an earlier connection fully completes, including reading its entire response body" loading="lazy" decoding="async" width="820" height="500"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="after-new-connections-can-start-as-soon-as-response-headers-arrive">After: New connections can start as soon as response headers arrive</h4><a class="anchor-link" href="#after-new-connections-can-start-as-soon-as-response-headers-arrive"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=500,format=svg/_astro/connection-limit-after.BfVRyLE8.svg" alt="A 7th fetch starts as soon as any earlier connection receives its response headers" loading="lazy" decoding="async" width="820" height="500"> <p>This means Workers can now have many more connections open at the same time without queueing, as long as no more than six are waiting for their initial response. This eliminates the <code>Response closed due to connection limit</code> exception that could previously occur when the runtime canceled stalled connections to prevent deadlocks.</p> <p>Previously, the runtime used a deadlock avoidance algorithm that watched each open connection for I/O activity. If all six connections appeared idle — even momentarily — the runtime would cancel the least-recently-used connection to make room for new requests. In practice, this heuristic was fragile. For example, when a response used <code>Content-Encoding: gzip</code>, the runtime's internal decompression created brief gaps between read and write operations. During these gaps, the connection appeared stalled despite being actively read by the Worker. If multiple connections hit these gaps at the same time, the runtime could spuriously cancel a connection that was working correctly. By only counting connections during the waiting-for-headers phase — where the runtime is fully in control and there is no ambiguity about whether the connection is active — this class of bug is eliminated entirely.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-connections-could-be-canceled-during-brief-internal-pauses">Before: Connections could be canceled during brief internal pauses</h4><a class="anchor-link" href="#before-connections-could-be-canceled-during-brief-internal-pauses"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=260,format=svg/_astro/connection-cancel-before.D4As_PDP.svg" alt="A connection with gaps from gzip decompression appears idle and is canceled by the runtime" loading="lazy" decoding="async" width="820" height="260"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="after-connections-complete-normally-regardless-of-internal-pauses">After: Connections complete normally regardless of internal pauses</h4><a class="anchor-link" href="#after-connections-complete-normally-regardless-of-internal-pauses"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=230,format=svg/_astro/connection-cancel-after.RdmZLNge.svg" alt="The same connection completes normally because the body phase is no longer counted against the limit" loading="lazy" decoding="async" width="820" height="230">Thu, 09 Apr 2026 00:00:00 GMTWorkersWorkersAI Search - Website Source CSS content selectors for precise content extraction in AI Searchhttps://developers.cloudflare.com/changelog/post/2026-04-09-ai-search-content-selectors/https://developers.cloudflare.com/changelog/post/2026-04-09-ai-search-content-selectors/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/content-selectors/">CSS content selectors</a> for website data sources. You can now define which parts of a crawled page are extracted and indexed by specifying CSS selectors paired with URL glob patterns.</p> <p>Content selectors solve the problem of indexing only relevant content while ignoring navigation, sidebars, footers, and other boilerplate. When a page URL matches a glob pattern, only elements matching the corresponding CSS selector are extracted and converted to Markdown for indexing.</p> <p>Configure content selectors via the dashboard or API:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/{account_id}/ai-search/instances"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {api_token}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "id": "my-ai-search",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source": "https://example.com",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "web-crawler",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source_params": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "web_crawler": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "parse_options": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content_selector": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "path": "**/blog/**",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "selector": "article .post-body"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>Selectors are evaluated in order, and the first matching pattern wins. You can define up to 10 content selector entries per instance.</p> <p>For configuration details and examples, refer to the <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/content-selectors/">content selectors documentation</a>.</p>Wed, 08 Apr 2026 00:00:00 GMTAI SearchAI SearchAI Search - New Workers AI models for text generation and embedding in AI Searchhttps://developers.cloudflare.com/changelog/post/2026-04-09-new-workers-ai-models/https://developers.cloudflare.com/changelog/post/2026-04-09-new-workers-ai-models/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports four additional <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> models across text generation and embedding.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="text-generation">Text generation</h4><a class="anchor-link" href="#text-generation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Model</th> <th>Context window (tokens)</th> </tr> </thead> <tbody> <tr> <td><code>@cf/zai-org/glm-4.7-flash</code></td> <td>131,072</td> </tr> <tr> <td><code>@cf/qwen/qwen3-30b-a3b-fp8</code></td> <td>32,000</td> </tr> </tbody> </table></div> <p>GLM-4.7-Flash is a lightweight model from Zhipu AI with a 131,072 token context window, suitable for long-document summarization and retrieval tasks. Qwen3-30B-A3B is a mixture-of-experts model from Alibaba that activates only 3 billion parameters per forward pass, keeping inference fast while maintaining strong response quality.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="embedding">Embedding</h4><a class="anchor-link" href="#embedding"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Model</th> <th>Vector dims</th> <th>Input tokens</th> <th>Metric</th> </tr> </thead> <tbody> <tr> <td><code>@cf/qwen/qwen3-embedding-0.6b</code></td> <td>1,024</td> <td>4,096</td> <td>cosine</td> </tr> <tr> <td><code>@cf/google/embeddinggemma-300m</code></td> <td>768</td> <td>512</td> <td>cosine</td> </tr> </tbody> </table></div> <p>Qwen3-Embedding-0.6B supports up to 4,096 input tokens, making it a good fit for indexing longer text chunks. EmbeddingGemma-300M from Google produces 768-dimension vectors and is optimized for low-latency embedding workloads.</p> <p>All four models are available without additional provider keys since they run on Workers AI. Select them when creating or updating an AI Search instance in the dashboard or through the API.</p> <p>For the full list of supported models, refer to <a href="https://developers.cloudflare.com/ai-search/configuration/models/supported-models/">Supported models</a>.</p>Wed, 08 Apr 2026 00:00:00 GMTAI SearchAI SearchRisk Score - User risk scoring for high risk browsing activityhttps://developers.cloudflare.com/changelog/post/2026-04-08-high-risk-browsing/https://developers.cloudflare.com/changelog/post/2026-04-08-high-risk-browsing/<p>Cloudflare One's <strong>User Risk Scoring</strong> now incorporates direct signals from <strong>Gateway DNS traffic patterns</strong>. This update allows security teams to automatically elevate a user's risk score when they visit high-risk or malicious domains, providing a more holistic view of internal threats.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Browsing activity is a primary indicator of potential compromise. By tying Gateway DNS logs to specific users, administrators can now flag individuals interacting with:</p> <ul> <li><strong>Security threats</strong>: Domains associated with malware, phishing, or command-and-control (C2) centers.</li> <li><strong>High-risk content</strong>: Categories such as questionable content or violence that may violate corporate compliance.</li> </ul> <p>Even if a Gateway policy is set to <strong>Block</strong> the traffic, the interaction is still captured as a "hit" to ensure the user's risk profile reflects the attempted activity.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-risk-behaviors">New risk behaviors</h4><a class="anchor-link" href="#new-risk-behaviors"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Two new behaviors are now available in the dashboard:</p> <ul> <li><strong>Suspicious Security Domain Visited</strong>: Triggers when a user visits a domain in the security threats or security risk categories.</li> <li><strong>High risk domain visited</strong>: Triggers when a user visits domains categorized as questionable content, violence, or CIPA.</li> </ul> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/">User Risk Scoring documentation</a>.</p>Wed, 08 Apr 2026 00:00:00 GMTRisk ScoreRisk ScoreSecurity Center - Real-time alerts and daily digests for Threat Eventshttps://developers.cloudflare.com/changelog/post/2026-04-08-threat-events-notification/https://developers.cloudflare.com/changelog/post/2026-04-08-threat-events-notification/<p>You can now automate your threat monitoring by setting up custom alerts in your saved views. Instead of manually checking the dashboard for updates, you can subscribe to notifications that trigger whenever new data matches your specific filter sets, like new activity associated to a particular threat actor or spikes in activity within your industry.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="stay-ahead-of-emerging-threats">Stay ahead of emerging threats</h4><a class="anchor-link" href="#stay-ahead-of-emerging-threats"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>By linking your saved views to the Cloudflare Notifications Center, you can ensure the right information reaches your team at the right time.</p> <ul> <li> <p><strong>Immediate Alerts</strong>: receive real-time notifications the moment a critical event is detected that matches your saved criteria. This is essential for high-priority monitoring, such as tracking active campaigns from specific APT groups.</p> </li> <li> <p><strong>Daily Digests</strong>: opt for a summarized report delivered once a day. This is ideal for maintaining situational awareness of broader trends, like regional activity shifts or industry-wide threat landscapes, without cluttering your inbox.</p> </li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2630,height=1424,format=webp/_astro/threat-events-notifications.3Fl8LGOn.png" alt="Threat Events notifications" loading="lazy" decoding="async" width="2630" height="1424"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-get-started">How to get started</h4><a class="anchor-link" href="#how-to-get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To set up an alert, go to <strong>Application Security</strong> &gt; <strong>Threat Intelligence</strong> &gt; <strong>Threat Events</strong>. From there:</p> <ol> <li>Choose your datasets and apply your desired filters and select <strong>Save View</strong> (or select an existing one).</li> <li>Open the <strong>Manage Saved Views</strong> menu.</li> <li>Select <strong>Add Alert</strong> next to your chosen view to configure your notification preferences in the Cloudflare dashboard.</li> </ol> <p>For more technical details on configuring notifications, refer to the <a href="https://developers.cloudflare.com/security-center/cloudforce-one/">Threat Events documentation</a>.</p>Wed, 08 Apr 2026 00:00:00 GMTSecurity CenterSecurity CenterCloudflare One Client - Cloudflare One Client for Windows (version 2026.3.851.0)https://developers.cloudflare.com/changelog/post/2026-04-07-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-04-07-warp-windows-ga/<p>A new GA release for the Windows Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p>The next stable release for Windows will introduce the new Cloudflare One Client UI, providing a cleaner and more intuitive design as well as easier access to common actions and information.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue causing Windows client tunnel interface initialization failure which prevented clients from establishing a tunnel for connection.</li> <li>Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.</li> <li>Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.</li> <li>Added monitoring for tunnel statistics collection timeouts.</li> <li>Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.</li> <li>Fixed packet capture failing on tunnel interface when the tunnel interface is renamed by SCCM VPN boundary support.</li> <li>Fixed unnecessary registration deletion caused by RDP connections in multi-user mode.</li> <li>Fixed increased tunnel interface start-up time due to a race between duplicate address detection (DAD) and disabling NetBT.</li> <li>Fixed tunnel failing to connect when the system DNS search list contains unexpected characters.</li> <li>Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.</li> <li>Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.</li> <li>Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.</li> <li>Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.</li> <li>Fixed an issue where degraded Windows Management Instrumentation (WMI) state could put the client in a failed connection state loop during initialization.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 version KB5062553</a> or higher for resolution. This warning will be omitted from future release notes. This Windows update was released in July 2025.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later. This warning will be omitted from future release notes. This Microsoft Security Intelligence update was released in May 2025.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while the client is connected.</li> </ul> <p>To work around this issue, reconnect the client by selecting <strong>Disconnect</strong> and then <strong>Connect</strong> in the client user interface.</p> </li> </ul> Tue, 07 Apr 2026 15:56:36 GMTCloudflare One ClientCloudflare One ClientEmail security - User Submission Triage Status Trackinghttps://developers.cloudflare.com/changelog/post/2026-04-07-triage-status-tracking/https://developers.cloudflare.com/changelog/post/2026-04-07-triage-status-tracking/<p>Cloudflare Email security now supports <strong>Triage Status Tracking for User Submissions</strong>. This enhancement gives SOC teams a streamlined way to track, manage, and prioritize user-submitted emails directly within the Cloudflare One dashboard.</p> <ul> <li>The User Submissions table now includes a <strong>Status</strong> column with three states: <strong>Unreviewed</strong> (new submissions awaiting triage), <strong>Reviewed</strong> (submissions assessed by the SOC team), and <strong>Escalated</strong> (submissions escalated to team submissions for further investigation). Analysts can quickly update statuses and filter the table to focus on what needs attention.</li> <li>SOC teams can now organize their triage workflows, avoid duplicate reviews, and make sure critical threats get escalated for deeper investigation—bringing order to the chaos of high-volume submission management.</li> </ul> <p>Triage Status Tracking is <strong>automatically available</strong> for all Email security customers using the user submissions feature. No additional configuration is required; customers just need to make sure user submissions are being sent to their user submission aliases.</p> <p>This applies to all Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Tue, 07 Apr 2026 09:00:00 GMTEmail securityEmail securityCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Link aggregation (LACP) support for Cloudflare One Appliancehttps://developers.cloudflare.com/changelog/post/2026-04-07-link-aggregation-lacp-appliance/https://developers.cloudflare.com/changelog/post/2026-04-07-link-aggregation-lacp-appliance/<p>Cloudflare One Appliance now supports Link Aggregation Control Protocol (LACP), allowing you to bundle up to six physical LAN ports into a single logical interface. Link aggregation increases available bandwidth and eliminates single points of failure on the LAN side of the appliance.</p> <p>This feature is available in beta on physical appliance hardware with the latest OS. No entitlement is required.</p> <p>To configure a Link Aggregation Group, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/link-aggregation/">Configure link aggregation groups</a>.</p>Tue, 07 Apr 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANSSL/TLS - Manage mTLS and BYO CA certificates from the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-04-07-mtls-byoca-dashboard/https://developers.cloudflare.com/changelog/post/2026-04-07-mtls-byoca-dashboard/<p>You can now manage mutual TLS (mTLS) and Bring Your Own Certificate Authority (BYO CA) configurations directly from the Cloudflare dashboard — no API required.</p> <p>Previously, these advanced workflows required the Cloudflare API. The following are now available in the dashboard:</p> <ul> <li><strong>AOP certificate management</strong> — Upload and manage your own certificate authorities for <a href="https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/">Authenticated Origin Pulls (AOP)</a> directly from the dashboard.</li> <li><strong>BYO Client mTLS certificate management</strong> — Upload and manage your own CA certificates for <a href="https://developers.cloudflare.com/ssl/client-certificates/byo-ca/">client mTLS enforcement</a> without needing API access.</li> <li><strong>CDN hostname to client mTLS certificate mapping</strong> — Associate client mTLS certificates with specific hostnames directly from the dashboard.</li> </ul>Tue, 07 Apr 2026 00:00:00 GMTSSL/TLSSSL/TLSSupport - Redesigned Support Portal for faster, personalized helphttps://developers.cloudflare.com/changelog/post/2026-04-06-redesigned-support-portal/https://developers.cloudflare.com/changelog/post/2026-04-06-redesigned-support-portal/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="redesigned-get-help-portal-for-faster-personalized-help">Redesigned "Get Help" Portal for faster, personalized help</h4><a class="anchor-link" href="#redesigned-get-help-portal-for-faster-personalized-help"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare has officially launched a redesigned "Get Help" Support Portal to eliminate friction and get you to a resolution faster. Previously, navigating support meant clicking through multiple tiles, categorizing your own technical issues across 50+ conditional fields, and translating your problem into Cloudflare's internal taxonomy.</p> <p>The new experience replaces that complexity with a personalized front door built around your specific account plan. Whether you are under a DDoS attack or have a simple billing question, the portal now presents a single, clean page that surfaces the direct paths available to you — such as "Ask AI", "Chat with a human", or "Community" — without the manual triage.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's New</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>One Page, Clear Choices</strong>: No more navigating a grid of overlapping categories. The portal now uses action cards tailored to your plan (Free, Pro, Business, or Enterprise), ensuring you only see the support channels you can actually use.</li> <li><strong>A Radically Simpler Support Form</strong>: We've reduced the ticket submission process from four+ screens and 50+ fields to a single screen with five critical inputs. You describe the issue in your own words, and our backend handles the categorization.</li> <li><strong>AI-Driven Triage</strong>: Using <a href="https://developers.cloudflare.com/workers-ai/" target="_blank" rel="noopener">Cloudflare Workers AI<span class="external-link"> ↗</span></a> and <a href="https://developers.cloudflare.com/vectorize/" target="_blank" rel="noopener">Vectorize<span class="external-link"> ↗</span></a>, the portal now automatically generates case subjects and predicts product categories.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="moving-complexity-to-the-backend">Moving complexity to the backend</h4><a class="anchor-link" href="#moving-complexity-to-the-backend"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Behind the scenes, we've moved the complexity from the user to our own developer stack. When you describe an issue, we use semantic embeddings to capture intent rather than just keywords.</p> <p>By leveraging case-based reasoning, our system compares your request against millions of resolved cases to route your inquiry to the specialist best equipped to help. This ensures that while the front-end experience is simpler for you, the back-end routing is more accurate than ever.</p> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/support/contacting-cloudflare-support/">Support documentation</a> or select <strong>Get Help</strong> directly in the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Dashboard<span class="external-link"> ↗</span></a>.</p>Tue, 07 Apr 2026 00:00:00 GMTSupportSupportWAF - WAF Release - 2026-04-07https://developers.cloudflare.com/changelog/post/2026-04-07-waf-release/https://developers.cloudflare.com/changelog/post/2026-04-07-waf-release/ <p>This week's release introduces new detections for a critical Remote Code Execution (RCE) vulnerability in MCP Server (CVE-2026-23744), alongside targeted protection for an authentication bypass vulnerability in SolarWinds products (CVE-2025-40552). Additionally, this release includes a new generic detection rule designed to identify and block Cross-Site Scripting (XSS) injection attempts leveraging "OnEvent" handlers within HTTP cookies.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>MCP Server (CVE-2026-23744): A vulnerability in the Model Context Protocol (MCP) server implementation where malformed input payloads can trigger a memory corruption state, allowing for arbitrary code execution.</p> </li> <li> <p>SolarWinds (CVE-2025-40552): A critical flaw in the authentication module allows unauthenticated attackers to bypass security filters and gain unauthorized access to the management console due to improper identity token validation.</p> </li> <li> <p>XSS OnEvents Cookies: This generic rule identifies malicious event handlers (such as onload or onerror) embedded within HTTP cookie values.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of the MCP Server and SolarWinds vulnerabilities could allow unauthenticated attackers to execute arbitrary code or gain administrative control, leading to a full system takeover. Additionally, the new generic XSS detection prevents attackers from leveraging browser event handlers in cookies to hijack user sessions or execute malicious scripts.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="73ae1cf103da4bacaa2e1a610aa410af"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0aa410af</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Generic Rules - Command Execution - 5 - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a88a85b0cc5a4bc2abead6289131ec2f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9131ec2f</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - 5 - Header</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="28518cdc40544979bbd86720551eb9e5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...551eb9e5</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - 5 - URI</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1177993d53a1467997002b44d46229eb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d46229eb</span></button></rule-id></td><td>N/A</td><td>MCP Server - Remote Code Execution - CVE:CVE-2026-23744</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3d43cdfbc3c14584942f8bc4a864b9c2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a864b9c2</span></button></rule-id></td><td>N/A</td><td>XSS - OnEvents - Cookies</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="41153470df2365192b0df74ca78ad04e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a78ad04e</span></button></rule-id></td><td>N/A</td><td>SQLi - Evasion - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="64d812e6d5844d7c9d7a44a440732d48"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...40732d48</span></button></rule-id></td><td>N/A</td><td>SQLi - Evasion - Headers</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="50de9369ef7c45928a5dfb34e68a99b5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e68a99b5</span></button></rule-id></td><td>N/A</td><td>SQLi - Evasion - URI</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="765ffb5c67b94c9589106c843e8143d2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3e8143d2</span></button></rule-id></td><td>N/A</td><td>SQLi - LIKE 3 - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5c3dbd4f115e47c781491fcd70e7fb97"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...70e7fb97</span></button></rule-id></td><td>N/A</td><td>SQLi - LIKE 3 - URI</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="89fa6027a0334949b1cb2e654c538bd9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4c538bd9</span></button></rule-id></td><td>N/A</td><td>SQLi - UNION - 2 - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="05946b3458364f1b9d4819d561c439c9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...61c439c9</span></button></rule-id></td><td>N/A</td><td>SQLi - UNION - 2 - URI</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b2fe5c2a39df4609b6d39908cf33ea10"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cf33ea10</span></button></rule-id></td><td>N/A</td><td>SolarWinds - Auth Bypass - CVE:CVE-2025-40552</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Tue, 07 Apr 2026 00:00:00 GMTWAFWAFWorkers - WebSockets now automatically reply to Close frameshttps://developers.cloudflare.com/changelog/post/2026-04-07-websocket-auto-reply-to-close/https://developers.cloudflare.com/changelog/post/2026-04-07-websocket-auto-reply-to-close/<p>The Workers runtime now automatically sends a reciprocal Close frame when it receives a Close frame from the peer. The <code>readyState</code> transitions to <code>CLOSED</code> before the <code>close</code> event fires. This matches the <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event" target="_blank" rel="noopener">WebSocket specification<span class="external-link"> ↗</span></a> and standard browser behavior.</p> <p>This change is enabled by default for Workers using compatibility dates on or after <code>2026-04-07</code> (via the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close"><code>web_socket_auto_reply_to_close</code></a> compatibility flag). Existing code that manually calls <code>close()</code> inside the <code>close</code> event handler will continue to work — the call is silently ignored when the WebSocket is already closed.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-dzsirb">client</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">server</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> Object.</span><span class="nb-shiki-1t8gfj">values</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> WebSocketPair</span><span class="nb-shiki-140thh">());</span></span> <span class="line"><span class="nb-shiki-140thh">server.</span><span class="nb-shiki-1t8gfj">accept</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">server.</span><span class="nb-shiki-1t8gfj">addEventListener</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"close"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // readyState is already CLOSED — no need to call server.close().</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(server.readyState); </span><span class="nb-shiki-21nrsd">// WebSocket.CLOSED</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(event.code); </span><span class="nb-shiki-21nrsd">// 1000</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(event.wasClean); </span><span class="nb-shiki-21nrsd">// true</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="half-open-mode-for-websocket-proxying">Half-open mode for WebSocket proxying</h4><a class="anchor-link" href="#half-open-mode-for-websocket-proxying"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The automatic close behavior can interfere with WebSocket proxying, where a Worker sits between a client and a backend and needs to coordinate the close on both sides independently. To support this use case, pass <code>{ allowHalfOpen: true }</code> to <code>accept()</code>:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-dzsirb">client</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">server</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> Object.</span><span class="nb-shiki-1t8gfj">values</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> WebSocketPair</span><span class="nb-shiki-140thh">());</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">server.</span><span class="nb-shiki-1t8gfj">accept</span><span class="nb-shiki-140thh">({ allowHalfOpen: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">server.</span><span class="nb-shiki-1t8gfj">addEventListener</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"close"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // readyState is still CLOSING here, giving you time</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // to coordinate the close on the other side.</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(server.readyState); </span><span class="nb-shiki-21nrsd">// WebSocket.CLOSING</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Manually close when ready.</span></span> <span class="line"><span class="nb-shiki-140thh"> server.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">(event.code, </span><span class="nb-shiki-mdbnqw">"done"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers/runtime-apis/websockets/#close-behavior">WebSockets Close behavior</a>.</p>Tue, 07 Apr 2026 00:00:00 GMTWorkersWorkersEmail security - DANE Support for MX Deploymentshttps://developers.cloudflare.com/changelog/post/2026-04-06-dane-support-mx-deployments/https://developers.cloudflare.com/changelog/post/2026-04-06-dane-support-mx-deployments/<p>Cloudflare Email Security now supports DANE (DNS-based Authentication of Named Entities) for MX deployments. This enhancement strengthens email transport security by enabling DNSSEC-backed certificate verification for our regional MX records.</p> <ul> <li>Regional MX hostnames now publish DANE TLSA records backed by DNSSEC, enabling DANE-capable SMTP senders to cryptographically validate certificate identities before establishing TLS connections—moving beyond opportunistic encryption to verified encrypted delivery.</li> <li>DANE support is automatically available for all customers using regional MX deployments. No additional configuration is required; DANE-capable mail infrastructure will automatically validate MX certificates using the published records.</li> </ul> <p>This applies to all Email Security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Mon, 06 Apr 2026 09:00:00 GMTEmail securityEmail securityCloudflare Fundamentals, Cloudflare One, Gateway, Organizations - Organizations is now in public beta for enterpriseshttps://developers.cloudflare.com/changelog/post/2026-04-06-organizations-public-beta/https://developers.cloudflare.com/changelog/post/2026-04-06-organizations-public-beta/<p>We're announcing the public beta of <strong>Organizations</strong> for enterprise customers, a new top-level Cloudflare container that lets Cloudflare customers manage multiple accounts, members, analytics, and shared policies from one centralized location.</p> <p><strong>What's New</strong></p> <p><strong>Organizations [BETA]</strong>: <a href="https://developers.cloudflare.com/fundamentals/organizations/">Organizations</a> are a new top-level container for centrally managing multiple accounts. Each Organization supports up to 500 accounts and 5000 zones, giving larger teams a single place to administer resources at scale.</p> <p><strong>Self-serve onboarding</strong>: Enterprise customers can <a href="https://developers.cloudflare.com/fundamentals/organizations/setup/">create an Organization</a> in the dashboard and assign accounts where they are already Super Administrators.</p> <p><strong>Centralized Account Management</strong>: At launch, every Organization member has the Organization Super Admin role. Organization Super Admins can invite other users and manage any child account under the Organization implicitly. <strong>Shared policies</strong>: Share <a href="https://developers.cloudflare.com/waf/custom-rules/">WAF</a> or <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/tiered-policies/organizations/">Gateway</a> policies across multiple accounts within your Organization to simplify centralized policy management. <strong>Implicit access</strong>: Members of an Organization automatically receive Super Administrator permissions across child accounts, removing the need for explicit membership on each account. Additional Org-level roles will be available over the course of the year.</p> <p><strong>Unified analytics</strong>: View, filter, and download aggregate HTTP analytics across all Organization child accounts from a single dashboard for centralized visibility into traffic patterns and security events.</p> <p><strong>Terraform provider support</strong>: Manage Organizations with infrastructure as code from day one. Provision organizations, assign accounts, and configure settings programmatically with the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/organization" target="_blank" rel="noopener">Cloudflare Terraform provider<span class="external-link"> ↗</span></a>.</p> <p><strong>Shared policies</strong>: Share <a href="https://developers.cloudflare.com/waf/custom-rules/">WAF</a> or <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway</a> policies across multiple accounts within your Organization to simplify centralized policy management.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Organizations is in Public Beta. You must have an Enterprise account to create an organization, but once created, you can add accounts of any plan type where you are a Super Administrator.</p></div></div></aside> <p>For more info:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/organizations/">Get started with Organizations</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/organizations/setup/">Set up your Organization</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/organizations/limitations/">Review limitations</a></li> </ul>Mon, 06 Apr 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare OneGatewayOrganizationsLogs - New ResponseTimeMs field in Gateway DNS Logpush datasethttps://developers.cloudflare.com/changelog/post/2026-04-06-gateway-dns-response-time-ms/https://developers.cloudflare.com/changelog/post/2026-04-06-gateway-dns-response-time-ms/<p>Cloudflare has added a new field to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/#responsetimems">Gateway DNS</a> Logpush dataset:</p> <ul> <li><strong>ResponseTimeMs</strong>: Total response time of the DNS request in milliseconds.</li> </ul> <p>For the complete field definitions, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/">Gateway DNS dataset</a>.</p>Mon, 06 Apr 2026 00:00:00 GMTLogsLogsContainers - Control where your Containers run with regional and jurisdictional placementhttps://developers.cloudflare.com/changelog/post/2026-04-05-regional-placement/https://developers.cloudflare.com/changelog/post/2026-04-05-regional-placement/<p>You can now specify placement constraints to control where your <a href="https://developers.cloudflare.com/containers/">Containers</a> run.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Constraint</th> <th>Values</th> <th>Use case</th> </tr> </thead> <tbody> <tr> <td><code>regions</code></td> <td><code>ENAM</code>, <code>WNAM</code>, <code>EEUR</code>, <code>WEUR</code></td> <td>Geographic placement</td> </tr> <tr> <td><code>jurisdiction</code></td> <td><code>eu</code>, <code>fedramp</code></td> <td>Compliance boundaries</td> </tr> </tbody> </table></div> <p>Use <code>regions</code> to limit placement to specific geographic areas. Use <code>jurisdiction</code> to restrict containers to compliance boundaries — <code>eu</code> maps to European regions (EEUR, WEUR) and <code>fedramp</code> maps to North American regions (ENAM, WNAM).</p> <p>Refer to <a href="https://developers.cloudflare.com/containers/platform-details/placement/">Containers placement</a> for more details.</p>Sun, 05 Apr 2026 00:00:00 GMTContainersContainersWorkers AI - Google Gemma 4 26B A4B now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-04-04-gemma-4-26b-a4b-workers-ai/https://developers.cloudflare.com/changelog/post/2026-04-04-gemma-4-26b-a4b-workers-ai/<p>We are partnering with Google to bring <a href="https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/"><code>@cf/google/gemma-4-26b-a4b-it</code></a> to Workers AI. Gemma 4 26B A4B is a Mixture-of-Experts (MoE) model built from Gemini 3 research, with 26B total parameters and only 4B active per forward pass. By activating a small subset of parameters during inference, the model runs almost as fast as a 4B-parameter model while delivering the quality of a much larger one.</p> <p>Gemma 4 is Google's most capable family of open models, designed to maximize intelligence-per-parameter.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Mixture-of-Experts architecture</strong> with 8 active experts out of 128 total (plus 1 shared expert), delivering frontier-level performance at a fraction of the compute cost of dense models</li> <li><strong>256,000 token context window</strong> for retaining full conversation history, tool definitions, and long documents across extended sessions</li> <li><strong>Built-in thinking mode</strong> that lets the model reason step-by-step before answering, improving accuracy on complex tasks</li> <li><strong>Vision understanding</strong> for object detection, document and PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), and handwriting recognition, with support for variable aspect ratios and resolutions</li> <li><strong>Function calling</strong> with native support for structured tool use, enabling agentic workflows and multi-step planning</li> <li><strong>Multilingual</strong> with out-of-the-box support for 35+ languages, pre-trained on 140+ languages</li> <li><strong>Coding</strong> for code generation, completion, and correction</li> </ul> <p>Use Gemma 4 26B A4B through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/run</code> or <code>/v1/chat/completions</code>, or the <a href="https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/">OpenAI-compatible endpoint</a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/">Gemma 4 26B A4B model page</a>.</p>Sat, 04 Apr 2026 00:00:00 GMTWorkers AIWorkers AICloudflare One Client - Cloudflare One Client for macOS (version 2026.3.846.0)https://developers.cloudflare.com/changelog/post/2026-04-02-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-04-02-warp-macos-ga/<p>A new GA release for the macOS Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p>The next stable release for macOS will introduce the new Cloudflare One Client UI, providing a cleaner and more intuitive design as well as easier access to common actions and information.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.</li> <li>Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.</li> <li>Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.</li> <li>Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.</li> <li>Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.</li> <li>Added monitoring for tunnel statistics collection timeouts.</li> <li>Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.</li> <li>Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.</li> </ul> Thu, 02 Apr 2026 16:28:33 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Client for Linux (version 2026.3.846.0)https://developers.cloudflare.com/changelog/post/2026-04-02-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-04-02-warp-linux-ga/<p>A new GA release for the Linux Cloudflare One Client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p>The next stable release for Linux will introduce the new Cloudflare One Client UI, providing a cleaner and more intuitive design as well as easier access to common actions and information.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.</li> <li>Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.</li> <li>Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.</li> <li>Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.</li> <li>Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.</li> <li>Added monitoring for tunnel statistics collection timeouts.</li> <li>Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.</li> <li>Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.</li> </ul> Thu, 02 Apr 2026 15:39:10 GMTCloudflare One ClientCloudflare One ClientAccess - Session management for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-04-02-mcp-portal-session-management/https://developers.cloudflare.com/changelog/post/2026-04-02-mcp-portal-session-management/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> support in-session management of upstream MCP server connections. Users can return to the server selection page at any time to enable or disable servers, reauthenticate, or change which data a server has access to — all without leaving their MCP client.</p> <p>To return to the server selection page, ask your AI agent with a prompt like "take me back to the server selection page." The portal responds with an authorization URL via <a href="https://modelcontextprotocol.io/specification/2025-03-26/server/elicitation" target="_blank" rel="noopener">MCP elicitation<span class="external-link"> ↗</span></a> that you open in your browser:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://&lt;subdomain&gt;.&lt;domain&gt;/authorize?elicitationId=&lt;ELICITATION_ID&gt;</span></span></code></pre></figure> <p>From the server selection page you can:</p> <ul> <li><strong>Enable or disable servers</strong> — Toggle individual upstream MCP servers on or off. Disabling a server removes its tools from the active session, which reduces context window usage.</li> <li><strong>Log out and reauthenticate</strong> — Log out of a server and log back in to change which data the server has access to, or to reauthenticate with different permissions.</li> </ul> <p>Users can also enable or disable a server inline by asking their AI agent directly, for example "enable the wiki server" or "disable my Jira server."</p> <p>The portal also automatically prompts connected users to authorize new servers when an admin adds them to the portal. This requires the use of <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/#enable-managed-oauth-on-an-mcp-server-portal">managed OAuth</a>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#manage-portal-sessions">Manage portal sessions</a>.</p>Thu, 02 Apr 2026 00:00:00 GMTAccessAccessAI Gateway - Automatically retry on upstream provider failures on AI Gatewayhttps://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/https://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/<p>AI Gateway now supports automatic retries at the gateway level. When an upstream provider returns an error, your gateway retries the request based on the retry policy you configure, without requiring any client-side changes.</p> <p>You can configure the retry count (up to 5 attempts), the delay between retries (from 100ms to 5 seconds), and the backoff strategy (Constant, Linear, or Exponential). These defaults apply to all requests through the gateway, and per-request headers can override them.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2344,height=502,format=webp/_astro/auto-retry-changelog.DoCXZnDy.png" alt="Retry Requests settings in the AI Gateway dashboard" loading="lazy" decoding="async" width="2344" height="502"> <p>This is particularly useful when you do not control the client making the request and cannot implement retry logic on the caller side. For more complex failover scenarios — such as failing across different providers — use <a href="https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/">Dynamic Routing</a>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/ai-gateway/configuration/manage-gateway/#retry-requests">Manage gateways</a>.</p>Thu, 02 Apr 2026 00:00:00 GMTAI GatewayAI GatewayLogs - BigQuery as Logpush destinationhttps://developers.cloudflare.com/changelog/post/2026-04-02-bigquery-destination/https://developers.cloudflare.com/changelog/post/2026-04-02-bigquery-destination/<p>Cloudflare Logpush now supports <strong>BigQuery</strong> as a native destination.</p> <p>Logs from Cloudflare can be sent to <a href="https://cloud.google.com/bigquery" target="_blank" rel="noopener">Google Cloud BigQuery<span class="external-link"> ↗</span></a> via <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a>. The destination can be configured through the Logpush UI in the Cloudflare dashboard or by using the <a href="https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/">Logpush API</a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/bigquery/">Destination Configuration</a> documentation.</p>Thu, 02 Apr 2026 00:00:00 GMTLogsLogsWorkflows, Workers - All Wrangler commands for Workflows now support local developmenthttps://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/https://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/<p>All <code>wrangler workflows</code> commands now accept a <code>--local</code> flag to target a Workflow running in a local <code>wrangler dev</code> session instead of the production API.</p> <p>You can now manage the full Workflow lifecycle locally, including triggering Workflows, listing instances, pausing, resuming, restarting, terminating, and sending events:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> workflows</span><span class="nb-shiki-mdbnqw"> list</span><span class="nb-shiki-dzsirb"> --local</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> workflows</span><span class="nb-shiki-mdbnqw"> trigger</span><span class="nb-shiki-mdbnqw"> my-workflow</span><span class="nb-shiki-dzsirb"> --local</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> workflows</span><span class="nb-shiki-mdbnqw"> instances</span><span class="nb-shiki-mdbnqw"> list</span><span class="nb-shiki-mdbnqw"> my-workflow</span><span class="nb-shiki-dzsirb"> --local</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> workflows</span><span class="nb-shiki-mdbnqw"> instances</span><span class="nb-shiki-mdbnqw"> pause</span><span class="nb-shiki-mdbnqw"> my-workflow</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">INSTANCE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --local</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> workflows</span><span class="nb-shiki-mdbnqw"> instances</span><span class="nb-shiki-mdbnqw"> send-event</span><span class="nb-shiki-mdbnqw"> my-workflow</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">INSTANCE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --type</span><span class="nb-shiki-mdbnqw"> my-event</span><span class="nb-shiki-dzsirb"> --local</span></span></code></pre></figure> <p>All commands also accept <code>--port</code> to target a specific <code>wrangler dev</code> session (defaults to <code>8787</code>).</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/workflows/build/local-development/">Workflows local development</a>.</p>Wed, 01 Apr 2026 12:00:00 GMTWorkflowsWorkflowsWorkersAI Search - Create, manage, search AI Search instances with Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/https://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> supports a <code>wrangler ai-search</code> command namespace. Use it to manage instances from the command line.</p> <p>The following commands are available:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>wrangler ai-search create</code></td> <td>Create a new instance with an interactive wizard</td> </tr> <tr> <td><code>wrangler ai-search list</code></td> <td>List all instances in your account</td> </tr> <tr> <td><code>wrangler ai-search get</code></td> <td>Get details of a specific instance</td> </tr> <tr> <td><code>wrangler ai-search update</code></td> <td>Update the configuration of an instance</td> </tr> <tr> <td><code>wrangler ai-search delete</code></td> <td>Delete an instance</td> </tr> <tr> <td><code>wrangler ai-search search</code></td> <td>Run a search query against an instance</td> </tr> <tr> <td><code>wrangler ai-search stats</code></td> <td>Get usage statistics for an instance</td> </tr> </tbody> </table></div> <p>The <code>create</code> command guides you through setup, choosing a name, source type (<code>r2</code> or <code>web</code>), and data source. You can also pass all options as flags for non-interactive use:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-instance</span><span class="nb-shiki-dzsirb"> --type</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-dzsirb"> --source</span><span class="nb-shiki-mdbnqw"> my-bucket</span></span></code></pre></figure> <p>Use <code>wrangler ai-search search</code> to query an instance directly from the CLI:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> ai-search</span><span class="nb-shiki-mdbnqw"> search</span><span class="nb-shiki-mdbnqw"> my-instance</span><span class="nb-shiki-dzsirb"> --query</span><span class="nb-shiki-mdbnqw"> "how do I configure caching?"</span></span></code></pre></figure> <p>All commands support <code>--json</code> for structured output that scripts and AI agents can parse directly.</p> <p>For full usage details, refer to the <a href="https://developers.cloudflare.com/ai-search/wrangler-commands/">Wrangler commands documentation</a>.</p>Wed, 01 Apr 2026 00:00:00 GMTAI SearchAI SearchCloudflare One, Access, Gateway - Logs UI refreshhttps://developers.cloudflare.com/changelog/post/2026-04-01-logs-ui-refresh/https://developers.cloudflare.com/changelog/post/2026-04-01-logs-ui-refresh/<p>Access authentication logs and Gateway activity logs (DNS, Network, and HTTP) now feature a refreshed user interface that gives you more flexibility when viewing and analyzing your logs.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2984,height=842,format=webp/_astro/cf1-new-logs-ui.DxF4x0l-.png" alt="Screenshot of the new logs UI showing DNS query logs with customizable columns and filtering options" loading="lazy" decoding="async" width="2984" height="842"> <p>The updated UI includes:</p> <ul> <li><strong>Filter by field</strong> - Select any field value to add it as a filter and narrow down your results.</li> <li><strong>Customizable fields</strong> - Choose which fields to display in the log table. Querying for fewer fields improves log loading performance.</li> <li><strong>View details</strong> - Select a timestamp to view the full details of a log entry.</li> <li><strong>Switch to classic view</strong> - Return to the previous log viewer interface if needed.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/access-authentication-logs/">Access authentication logs</a> and <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/">Gateway activity logs</a>.</p>Wed, 01 Apr 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessGatewayRadar - Routing Section Expansion on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-04-01-radar-routing-section/https://developers.cloudflare.com/changelog/post/2026-04-01-radar-routing-section/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now features an expanded <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Routing section<span class="external-link"> ↗</span></a> with dedicated sub-pages, providing a more organized and in-depth view of the global routing ecosystem. This restructuring lays the groundwork for additional routing features and widgets coming in the near future.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dedicated-sub-pages">Dedicated sub-pages</h4><a class="anchor-link" href="#dedicated-sub-pages"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The single Routing page has been split into three focused sub-pages:</p> <ul> <li><a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener"><strong>Overview</strong><span class="external-link"> ↗</span></a> — Routing statistics, IP address space trends, BGP announcements, and the new Top 100 ASes ranking.</li> <li><a href="https://radar.cloudflare.com/routing/rpki" target="_blank" rel="noopener"><strong>RPKI</strong><span class="external-link"> ↗</span></a> — RPKI validation status, ASPA deployment trends, and per-ASN ASPA provider details.</li> <li><a href="https://radar.cloudflare.com/routing/anomalies" target="_blank" rel="noopener"><strong>Anomalies</strong><span class="external-link"> ↗</span></a> — BGP route leaks, origin hijacks, and Multi-Origin AS (MOAS) conflicts.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=574,height=342,format=webp/_astro/routing-section-menu.CEq17il_.png" alt="Screenshot of the routing section menu" loading="lazy" decoding="async" width="574" height="342"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-widgets">New widgets</h4><a class="anchor-link" href="#new-widgets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The routing overview now includes a <strong>Top 100 ASes</strong> table ranking autonomous systems by customer cone size, IPv4 address space, or IPv6 address space. Users can switch between rankings using a segmented control.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1426,format=webp/_astro/top-100-ases-table.ZBSReN_5.png" alt="Screenshot of the top-100 ASes table" loading="lazy" decoding="async" width="1600" height="1426"> <p>The RPKI sub-page introduces a <strong>RPKI validation</strong> view for per-ASN pages, showing prefixes grouped by RPKI validation status (Valid, Invalid, Unknown) with visibility scores.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=978,format=webp/_astro/rpki-validation-view.D3eQih4x.png" alt="Screenshot of the RPKI validation view" loading="lazy" decoding="async" width="1600" height="978"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-ip-address-space-chart">Improved IP address space chart</h4><a class="anchor-link" href="#improved-ip-address-space-chart"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">IP address space<span class="external-link"> ↗</span></a> chart now displays both IPv4 and IPv6 trends stacked vertically and is available on global, country, and AS views.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1310,format=webp/_astro/combined-ipv4-ipv6-space.DQ5qc8la.png" alt="Screenshot of the IPv4 and IPv6 combined IP space chart" loading="lazy" decoding="async" width="1600" height="1310"> <p>Check out the <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Radar routing section<span class="external-link"> ↗</span></a> to explore the data, and stay tuned for more routing insights coming soon.</p>Wed, 01 Apr 2026 00:00:00 GMTRadarRadarRules - New QUIC RTT and delivery rate fieldshttps://developers.cloudflare.com/changelog/post/2026-04-01-quic-rtt-delivery-rate-fields/https://developers.cloudflare.com/changelog/post/2026-04-01-quic-rtt-delivery-rate-fields/<p>Two new fields are now available in rule expressions that surface Layer 4 transport telemetry from the client connection. Together with the existing <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/"><code>cf.timings.client_tcp_rtt_msec</code></a> field, these fields give you a complete picture of connection quality for both TCP and QUIC traffic — enabling transport-aware rules without requiring any client-side changes.</p> <p>Previously, QUIC RTT and delivery rate data was only available via the <code>Server-Timing: cfL4</code> response header. These new fields make the same data available directly in rule expressions, so you can use them in Transform Rules, WAF Custom Rules, and other phases that support dynamic fields.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields">New fields</h4><a class="anchor-link" href="#new-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>cf.timings.client_quic_rtt_msec</code></td> <td>Integer</td> <td>The smoothed QUIC round-trip time (RTT) between Cloudflare and the client in milliseconds. Only populated for QUIC (HTTP/3) connections. Returns <code>0</code> for TCP connections.</td> </tr> <tr> <td><code>cf.edge.l4.delivery_rate</code></td> <td>Integer</td> <td>The most recent data delivery rate estimate for the client connection, in bytes per second. Returns <code>0</code> when L4 statistics are not available for the request.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-route-slow-connections-to-a-lightweight-origin">Example: Route slow connections to a lightweight origin</h4><a class="anchor-link" href="#example-route-slow-connections-to-a-lightweight-origin"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use a request header transform rule to tag requests from high-latency connections, so your origin can serve a lighter page variant:</p> <p><strong>Rule expression:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">cf.timings.client_tcp_rtt_msec &gt; 200 or cf.timings.client_quic_rtt_msec &gt; 200</span></span></code></pre></figure> <p><strong>Header modifications:</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Operation</th> <th>Header name</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>Set</td> <td><code>X-High-Latency</code></td> <td><code>true</code></td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-match-low-bandwidth-connections">Example: Match low-bandwidth connections</h4><a class="anchor-link" href="#example-match-low-bandwidth-connections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">cf.edge.l4.delivery_rate &gt; 0 and cf.edge.l4.delivery_rate &lt; 100000</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/rules/transform/request-header-modification/">Request Header Transform Rules</a> and the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/">fields reference</a>.</p>Wed, 01 Apr 2026 00:00:00 GMTRulesRulesWorkers - Deploy Hooks are now available for Workers Buildshttps://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/https://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/ <p><a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a> now supports Deploy Hooks — trigger builds from your headless CMS, a Cron Trigger, a Slack bot, or any system that can send an HTTP request.</p> <p>Each Deploy Hook is a unique URL tied to a specific branch. Send it a <code>POST</code> and your Worker builds and deploys.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/workers/builds/deploy_hooks/&lt;DEPLOY_HOOK_ID&gt;"</span></span></code></pre></figure> <p>To create one, go to <strong>Workers &amp; Pages</strong> &gt; your Worker &gt; <strong>Settings</strong> &gt; <strong>Builds</strong> &gt; <strong>Deploy Hooks</strong>.</p> <p>Since a Deploy Hook is a URL, you can also call it from another Worker. For example, a Worker with a <a href="https://developers.cloudflare.com/workers/configuration/cron-triggers/">Cron Trigger</a> can rebuild your project on a schedule:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> scheduled</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx.</span><span class="nb-shiki-1t8gfj">waitUntil</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">DEPLOY_HOOK_URL</span><span class="nb-shiki-140thh">, { method: </span><span class="nb-shiki-mdbnqw">"POST"</span><span class="nb-shiki-140thh"> }));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> scheduled</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ScheduledEvent</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ExecutionContext</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-dzsirb">void</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-140thh"> ctx.</span><span class="nb-shiki-1t8gfj">waitUntil</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">DEPLOY_HOOK_URL</span><span class="nb-shiki-140thh">, { method: </span><span class="nb-shiki-mdbnqw">"POST"</span><span class="nb-shiki-140thh"> }));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>You can also use Deploy Hooks to <a href="https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#cms-integration">rebuild when your CMS publishes new content</a> or <a href="https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#deploy-from-a-slack-slash-command">deploy from a Slack slash command</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="built-in-optimizations">Built-in optimizations</h4><a class="anchor-link" href="#built-in-optimizations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Automatic deduplication</strong>: If a Deploy Hook fires multiple times before the first build starts running, redundant builds are automatically skipped. This keeps your build queue clean when webhooks retry or CMS events arrive in bursts.</li> <li><strong>Last triggered</strong>: The dashboard shows when each hook was last triggered.</li> <li><strong>Build source</strong>: Your Worker's build history shows which Deploy Hook started each build by name.</li> </ul> <p>Deploy Hooks are rate limited to 10 builds per minute per Worker and 100 builds per minute per account. For all limits, see <a href="https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/">Limits &amp; pricing</a>.</p> <p>To get started, read the <a href="https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/">Deploy Hooks documentation</a>.</p>Wed, 01 Apr 2026 00:00:00 GMTWorkersWorkersWorkers - New L4 transport telemetry fields in Workershttps://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/https://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/<p>Three new properties are now available on <code>request.cf</code> in Workers that expose Layer 4 transport telemetry from the client connection. These properties let your Worker make decisions based on real-time connection quality signals — such as round-trip time and data delivery rate — without requiring any client-side changes.</p> <p>Previously, this telemetry was only available via the <code>Server-Timing: cfL4</code> response header. These new properties surface the same data directly in the Workers runtime, so you can use it for routing, logging, or response customization.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-properties">New properties</h4><a class="anchor-link" href="#new-properties"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Property</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>clientTcpRtt</code></td> <td>number | undefined</td> <td>The smoothed TCP round-trip time (RTT) between Cloudflare and the client in milliseconds. Only present for TCP connections (HTTP/1, HTTP/2). For example, <code>22</code>.</td> </tr> <tr> <td><code>clientQuicRtt</code></td> <td>number | undefined</td> <td>The smoothed QUIC round-trip time (RTT) between Cloudflare and the client in milliseconds. Only present for QUIC connections (HTTP/3). For example, <code>42</code>.</td> </tr> <tr> <td><code>edgeL4</code></td> <td>Object | undefined</td> <td>Layer 4 transport statistics. Contains <code>deliveryRate</code> (number) — the most recent data delivery rate estimate for the connection, in bytes per second. For example, <code>123456</code>.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-log-connection-quality-metrics">Example: Log connection quality metrics</h4><a class="anchor-link" href="#example-log-connection-quality-metrics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> cf</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> request.cf;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> rtt</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cf.clientTcpRtt </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-140thh"> cf.clientQuicRtt </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> deliveryRate</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cf.edgeL4?.deliveryRate </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> transport</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cf.clientTcpRtt </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-mdbnqw"> "TCP"</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-mdbnqw"> "QUIC"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Transport: ${</span><span class="nb-shiki-140thh">transport</span><span class="nb-shiki-mdbnqw">}, RTT: ${</span><span class="nb-shiki-140thh">rtt</span><span class="nb-shiki-mdbnqw">}ms, Delivery rate: ${</span><span class="nb-shiki-140thh">deliveryRate</span><span class="nb-shiki-mdbnqw">} B/s`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> headers</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Headers</span><span class="nb-shiki-140thh">(request.headers);</span></span> <span class="line"><span class="nb-shiki-140thh"> headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"X-Client-RTT"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">String</span><span class="nb-shiki-140thh">(rtt));</span></span> <span class="line"><span class="nb-shiki-140thh"> headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"X-Delivery-Rate"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">String</span><span class="nb-shiki-140thh">(deliveryRate));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(request, { headers }));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers/runtime-apis/request/">Workers Runtime APIs: Request</a>.</p>Wed, 01 Apr 2026 00:00:00 GMTWorkersWorkersDNS - Internal DNS - now in open betahttps://developers.cloudflare.com/changelog/post/2026-03-31-internal-dns-open-beta/https://developers.cloudflare.com/changelog/post/2026-03-31-internal-dns-open-beta/<p>Internal DNS is now in open beta.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="who-can-use-it">Who can use it?</h4><a class="anchor-link" href="#who-can-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Internal DNS is bundled as a part of Cloudflare Gateway and is now available to every Enterprise customer with one of the following subscriptions:</p> <ul> <li>Cloudflare Zero Trust Enterprise</li> <li>Cloudflare Gateway Enterprise</li> </ul> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS documentation</a>.</p>Tue, 31 Mar 2026 00:00:00 GMTDNSDNSWAF - WAF Release - 2026-03-30https://developers.cloudflare.com/changelog/post/2026-03-30-waf-release/https://developers.cloudflare.com/changelog/post/2026-03-30-waf-release/ <p>This week's release introduces new detections for a critical authentication bypass vulnerability in Fortinet products (CVE-2025-59718), alongside three new generic detection rules designed to identify and block HTTP Parameter Pollution attempts. Additionally, this release includes targeted protection for a high-impact unrestricted file upload vulnerability in Magento and Adobe Commerce.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>CVE-2025-59718: An improper cryptographic signature verification vulnerability in Fortinet FortiOS, FortiProxy, and FortiSwitchManager. This may allow an unauthenticated attacker to bypass the FortiCloud SSO login authentication using a maliciously crafted SAML message, if that feature is enabled on the device.</p> </li> <li> <p>Magento 2 - Unrestricted File Upload: A critical flaw in Magento and Adobe Commerce allows unauthenticated attackers to bypass security checks and upload malicious files to the server, potentially leading to Remote Code Execution (RCE).</p> </li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of the Fortinet and Magento vulnerabilities could allow unauthenticated attackers to gain administrative control or deploy webshells, leading to complete server compromise and data theft.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4f7d513cea424c2a853881982f7f95e9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2f7f95e9</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Generic Rules - Parameter Pollution - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="60d023f3be414d379428add3319731a4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...319731a4</span></button></rule-id></td><p><td>N/A</td> <td>Generic Rules - Parameter Pollution - Header - Form</td> <td>Log</td> <td>Disabled</td><br> <td>This is a new detection.</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2dde02d792ad41ec8fd65c2bdef262dd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...def262dd</span></button></rule-id></td><p><td>N/A</td> <td>Generic Rules - Parameter Pollution - URI</td> <td>Log</td> <td>Disabled</td><br> <td>This is a new detection.</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ab8a96ed13034d56a81a79e570a36147"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...70a36147</span></button></rule-id></td><td>N/A</td><td>Magento 2 - Unrestricted file upload</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0a13a38dd81c44688950444e2ffcca9f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2ffcca9f</span></button></rule-id></td><td>N/A</td><td>Fortinet FortiCloud SSO - Authentication Bypass - CVE:CVE-2025-59718</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Mon, 30 Mar 2026 00:00:00 GMTWAFWAFWorkers - New RFC 9440 mTLS certificate fields in Workershttps://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/https://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/<p>Four new fields are now available on <code>request.cf.tlsClientAuth</code> in Workers for requests that include a mutual TLS (mTLS) client certificate. These fields encode the client certificate and its intermediate chain in <a href="https://www.rfc-editor.org/rfc/rfc9440" target="_blank" rel="noopener">RFC 9440<span class="external-link"> ↗</span></a> format — the same standard format used by the <code>Client-Cert</code> and <code>Client-Cert-Chain</code> HTTP headers — so your Worker can forward them directly to your origin without any custom parsing or encoding logic.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields">New fields</h4><a class="anchor-link" href="#new-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>certRFC9440</code></td> <td>String</td> <td>The client leaf certificate in RFC 9440 format (<code>:base64-DER:</code>). Empty if no client certificate was presented.</td> </tr> <tr> <td><code>certRFC9440TooLarge</code></td> <td>Boolean</td> <td><code>true</code> if the leaf certificate exceeded 10 KB and was omitted from <code>certRFC9440</code>.</td> </tr> <tr> <td><code>certChainRFC9440</code></td> <td>String</td> <td>The intermediate certificate chain in RFC 9440 format as a comma-separated list. Empty if no intermediates were sent or if the chain exceeded 16 KB.</td> </tr> <tr> <td><code>certChainRFC9440TooLarge</code></td> <td>Boolean</td> <td><code>true</code> if the intermediate chain exceeded 16 KB and was omitted from <code>certChainRFC9440</code>.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-forwarding-client-certificate-headers-to-your-origin">Example: forwarding client certificate headers to your origin</h4><a class="anchor-link" href="#example-forwarding-client-certificate-headers-to-your-origin"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> tls</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> request.cf.tlsClientAuth;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Only forward if cert was verified and chain is complete</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">tls </span><span class="nb-shiki-1itgoe">||</span><span class="nb-shiki-1itgoe"> !</span><span class="nb-shiki-140thh">tls.certVerified </span><span class="nb-shiki-1itgoe">||</span><span class="nb-shiki-140thh"> tls.certRevoked </span><span class="nb-shiki-1itgoe">||</span><span class="nb-shiki-140thh"> tls.certChainRFC9440TooLarge) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Unauthorized"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">401</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> headers</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Headers</span><span class="nb-shiki-140thh">(request.headers);</span></span> <span class="line"><span class="nb-shiki-140thh"> headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Client-Cert"</span><span class="nb-shiki-140thh">, tls.certRFC9440);</span></span> <span class="line"><span class="nb-shiki-140thh"> headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Client-Cert-Chain"</span><span class="nb-shiki-140thh">, tls.certChainRFC9440);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(request, { headers }));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/ssl/client-certificates/client-certificate-variables/#workers-variables">Client certificate variables</a> and <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/mutual-tls-authentication/">Mutual TLS authentication</a>.</p>Fri, 27 Mar 2026 00:00:00 GMTWorkersWorkersAccess - Code Mode for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-code-mode/https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-code-mode/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> support <a href="https://developers.cloudflare.com/agents/model-context-protocol/codemode/">Code Mode MCP server patterns</a>, a technique that reduces context window usage by replacing individual tool definitions with a single code execution tool. Code Mode is turned on by default on all portals.</p> <p>To turn it off, edit the portal in <strong>Access controls</strong> &gt; <strong>AI controls</strong> and turn off <strong>Code Mode</strong> under <strong>Basic information</strong>.</p> <p>When Code Mode is active, the portal exposes a single <code>code</code> tool instead of listing every tool from every upstream MCP server. The connected AI agent writes JavaScript that calls typed <code>codemode.*</code> methods for each upstream tool. The generated code runs in an isolated <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/">Dynamic Worker</a> environment, keeping authentication credentials and environment variables out of the model context.</p> <p>To use Code Mode, append <code>?codemode=search_and_execute</code> to your portal URL when connecting from an MCP client:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://&lt;subdomain&gt;.&lt;domain&gt;/mcp?codemode=search_and_execute</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#code-mode">Code Mode</a>.</p>Thu, 26 Mar 2026 00:00:00 GMTAccessAccessAccess - Context optimization for MCP server portalshttps://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-context-optimization/https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-context-optimization/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> support two context optimization options that reduce how many tokens tool definitions consume in the model's context window. Both options are activated by appending the <code>optimize_context</code> query parameter to the portal URL.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="minimize_tools"><code>minimize_tools</code></h4><a class="anchor-link" href="#minimize_tools"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Strips tool descriptions and input schemas from all upstream tools, leaving only their names. The portal exposes a special <code>query</code> tool that agents use to retrieve full definitions on demand. This provides up to 5x savings in token usage.</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://&lt;subdomain&gt;.&lt;domain&gt;/mcp?optimize_context=minimize_tools</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="search_and_execute"><code>search_and_execute</code></h4><a class="anchor-link" href="#search_and_execute"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Hides all upstream tools and exposes only two tools: <code>query</code> and <code>execute</code>. The <code>query</code> tool searches and retrieves tool definitions. The <code>execute</code> tool runs the upstream tools in an isolated <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/">Dynamic Worker</a> environment. This reduces the initial token cost to a small constant, regardless of how many tools are available through the portal.</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://&lt;subdomain&gt;.&lt;domain&gt;/mcp?optimize_context=search_and_execute</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#optimize-context">Optimize context</a>.</p>Thu, 26 Mar 2026 00:00:00 GMTAccessAccessContainers - Easily connect Containers and Sandboxes to Workershttps://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/<p><a href="https://developers.cloudflare.com/containers/">Containers</a> and <a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> now support connecting directly to Workers over HTTP. This allows you to call Workers functions and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">bindings</a>, like <a href="https://developers.cloudflare.com/kv">KV</a> or <a href="https://developers.cloudflare.com/r2/">R2</a>, from within the container at specific hostnames.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="run-worker-code">Run Worker code</h4><a class="anchor-link" href="#run-worker-code"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Define an <code>outbound</code> handler to capture any HTTP request or use <code>outboundByHost</code> to capture requests to individual hostnames and IPs.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyApp</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Sandbox</span><span class="nb-shiki-140thh"> {}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MyApp.</span><span class="nb-shiki-1t8gfj">outbound</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // you can run arbitrary functions defined in your Worker on any HTTP request</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> someWorkersFunction</span><span class="nb-shiki-140thh">(request.body);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MyApp.outboundByHost </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "my.worker"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> anotherFunction</span><span class="nb-shiki-140thh">(request.body);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>In this example, requests from the container to <code>http://my.worker</code> will run the function defined within <code>outboundByHost</code>, and any other HTTP requests will run the <code>outbound</code> handler. These handlers run entirely inside the Workers runtime, outside of the container sandbox.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="access-workers-bindings">Access Workers bindings</h4><a class="anchor-link" href="#access-workers-bindings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Each handler has access to <code>env</code>, so it can call any binding set in <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#bindings">Wrangler config</a>. Code inside the container makes a standard HTTP request to that hostname and the outbound Worker translates it into a binding call.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyApp</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Sandbox</span><span class="nb-shiki-140thh"> {}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MyApp.outboundByHost </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "my.kv"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> key</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url).pathname.</span><span class="nb-shiki-1t8gfj">slice</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(key);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(value </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> ""</span><span class="nb-shiki-140thh">, { status: value </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-dzsirb"> 200</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-dzsirb"> 404</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "my.r2"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> key</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url).pathname.</span><span class="nb-shiki-1t8gfj">slice</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> object</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BUCKET</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(key);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(object?.body </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> ""</span><span class="nb-shiki-140thh">, { status: object </span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-dzsirb"> 200</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-dzsirb"> 404</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Now, from inside the container sandbox, <code>curl http://my.kv/some-key</code> will access <a href="https://developers.cloudflare.com/kv">Workers KV</a> and <code>curl http://my.r2/some-object</code> will access <a href="https://developers.cloudflare.com/r2/">R2</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="access-durable-object-state">Access Durable Object state</h4><a class="anchor-link" href="#access-durable-object-state"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use <code>ctx.containerId</code> to reference the container's automatically provisioned <a href="https://developers.cloudflare.com/durable-objects">Durable Object</a>.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyContainer</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Container</span><span class="nb-shiki-140thh"> {}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">MyContainer.outboundByHost </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "get-state.do"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_CONTAINER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">idFromString</span><span class="nb-shiki-140thh">(ctx.containerId);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_CONTAINER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(id);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">getStateForKey</span><span class="nb-shiki-140thh">(request.body);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>This provides an easy way to associate state with any container instance, and includes a <a href="https://developers.cloudflare.com/durable-objects/get-started/#2-write-a-durable-object-class-using-sql-api">built-in SQLite database</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started-today">Get Started Today</h4><a class="anchor-link" href="#get-started-today"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Upgrade to <code>@cloudflare/containers</code> version 0.2.0 or later, or <code>@cloudflare/sandbox</code> version 0.8.0 or later to use outbound Workers.</p> <p>Refer to <a href="https://developers.cloudflare.com/containers/platform-details/outbound-traffic/">Containers outbound traffic</a> and <a href="https://developers.cloudflare.com/sandbox/guides/outbound-traffic/">Sandboxes outbound traffic</a> for more details and examples.</p>Thu, 26 Mar 2026 00:00:00 GMTContainersContainersData Loss Prevention - Streaming ZIP file scanning removes per-file size limitshttps://developers.cloudflare.com/changelog/post/2026-03-26-streaming-zip-handler/https://developers.cloudflare.com/changelog/post/2026-03-26-streaming-zip-handler/<p>DLP now processes ZIP files using a streaming handler that scans archive contents element-by-element as data arrives. This removes previous file size limitations and improves memory efficiency when scanning large archives.</p> <p>Microsoft Office documents (DOCX, XLSX, PPTX) also benefit from this improvement, as they use ZIP as a container format.</p> <p>This improvement is automatic — no configuration changes are required.</p>Thu, 26 Mar 2026 00:00:00 GMTData Loss PreventionData Loss PreventionDurable Objects, Workers - Access Durable Object jurisdiction via `ctx.id.jurisdiction`https://developers.cloudflare.com/changelog/post/2026-03-26-durable-object-id-jurisdiction/https://developers.cloudflare.com/changelog/post/2026-03-26-durable-object-id-jurisdiction/<p><code>ctx.id.jurisdiction</code> inside a Durable Object now reports the <a href="https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction">jurisdiction</a> the object was created in — for example <code>"eu"</code> when accessed through <code>env.MY_DURABLE_OBJECT.jurisdiction("eu")</code> — so you can make region-aware decisions without passing the jurisdiction through method arguments or persisting it in storage. For the full list of ID-construction paths that preserve <code>jurisdiction</code>, refer to the <a href="https://developers.cloudflare.com/durable-objects/api/id/#jurisdiction">Durable Object ID documentation</a>.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> RegionalRoom</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // "eu" when accessed through env.MY_DURABLE_OBJECT.jurisdiction("eu")</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> region</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.id.jurisdiction;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Hello from ${</span><span class="nb-shiki-140thh">region</span><span class="nb-shiki-1itgoe"> ??</span><span class="nb-shiki-mdbnqw"> "the default region"}!`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Worker</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">jurisdiction</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"eu"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"general"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p><code>ctx.id.jurisdiction</code> is <code>undefined</code> for Durable Objects that were not created in a jurisdiction-restricted namespace. Alarms scheduled before 2026-03-15 also do not have <code>jurisdiction</code> stored; to backfill the value, reschedule the alarm from a <code>fetch()</code> or RPC handler.</p>Thu, 26 Mar 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersRadar - URL Scanner improvements on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-03-26-url-scanner-improvements/https://developers.cloudflare.com/changelog/post/2026-03-26-url-scanner-improvements/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> ships several improvements to the <a href="https://radar.cloudflare.com/scan" target="_blank" rel="noopener">URL Scanner<span class="external-link"> ↗</span></a> that make scan reports more informative and easier to share:</p> <ul> <li><strong>Live screenshots</strong> — the summary card now includes an option to capture a live screenshot of the scanned URL on demand using the <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> API.</li> <li><strong>Save as PDF</strong> — a new button generates a print-optimized document aggregating all tab contents (Summary, Security, Network, Behavior, and Indicators) into a single file.</li> <li><strong>Download as JSON</strong> — raw scan data is available as a JSON download for programmatic use.</li> <li><strong>Redesigned summary layout</strong> — page information and security details are now displayed side by side with the screenshot, with a layout that adapts to narrower viewports.</li> <li><strong>File downloads</strong> — downloads are separated into a dedicated card with expandable rows showing each file's source URL and SHA256 hash.</li> <li><strong>Detailed IP address data</strong> — the Network tab now includes additional detail per IP address observed during the scan.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2424,height=2658,format=webp/_astro/url-scanner-summary-redesign.DO4wDjQ3.png" alt="Screenshot of the redesigned URL Scanner summary on Radar" loading="lazy" decoding="async" width="2424" height="2658"> <p>Explore these improvements on the <a href="https://radar.cloudflare.com/scan" target="_blank" rel="noopener">Cloudflare Radar URL Scanner<span class="external-link"> ↗</span></a>.</p>Thu, 26 Mar 2026 00:00:00 GMTRadarRadarData Loss Prevention - Detect and sanitize HAR fileshttps://developers.cloudflare.com/changelog/post/2026-03-25-har-file-detection-and-sanitization/https://developers.cloudflare.com/changelog/post/2026-03-25-har-file-detection-and-sanitization/<p>HTTP Archive (HAR) files are used by engineering and support teams to capture and share web traffic logs for troubleshooting. However, these files routinely contain highly sensitive data — including session cookies, authorization headers, and other credentials — that can pose a significant risk if uploaded to third-party services without being reviewed or cleaned first.</p> <p>Gateway now includes a predefined DLP profile called <strong>Unsanitized HAR</strong> that detects HAR files in HTTP traffic. You can use this profile in a Gateway HTTP policy to either block HAR file uploads entirely or redirect users to a sanitization tool before allowing the upload to proceed.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-configure-a-har-file-policy">How to configure a HAR file policy</h4><a class="anchor-link" href="#how-to-configure-a-har-file-policy"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Zero Trust</strong> &gt; <strong>Traffic policies</strong> &gt; <strong>Firewall Policies</strong> &gt; <strong>HTTP</strong> and create a new HTTP policy using the <strong>DLP Profile</strong> selector:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Selector</th> <th>Operator</th> <th>Value</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td>DLP Profile</td> <td>in</td> <td><em>Unsanitized HAR</em></td> <td></td> </tr> </tbody> </table></div> <p>Then choose one of the following actions:</p> <ul> <li><strong>Block</strong>: Prevents the upload of any HAR file that has not been sanitized by Cloudflare's sanitizer. Use this for strict environments where HAR file sharing must be disallowed entirely.</li> <li><strong>Block</strong> with <strong>Gateway Redirect</strong>: Intercepts the upload and redirects the user to <code>https://har-sanitizer.pages.dev/</code>, where they can sanitize the file. Once sanitized, the user can re-upload the clean file and proceed with their workflow.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sanitized-har-recognition">Sanitized HAR recognition</h4><a class="anchor-link" href="#sanitized-har-recognition"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>HAR files processed by the Cloudflare HAR sanitizer receive a tamper-evident sanitized marker. DLP recognizes this marker and will not re-trigger the policy on a file that has already been sanitized and has not been modified since. If a previously sanitized file is edited, it will be treated as unsanitized and flagged again.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="visibility-in-gateway-logs">Visibility in Gateway logs</h4><a class="anchor-link" href="#visibility-in-gateway-logs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Gateway logs will reflect whether a detected HAR file was classified as <strong>Unsanitized</strong> or <strong>Sanitized</strong>, giving your security team full visibility into HAR file activity across your organization.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/">predefined DLP profiles</a>.</p>Wed, 25 Mar 2026 00:00:00 GMTData Loss PreventionData Loss Preventionlogpush, Logs - Logpush — More granular timestampshttps://developers.cloudflare.com/changelog/post/2026-03-25-logpush-granular-timestamps/https://developers.cloudflare.com/changelog/post/2026-03-25-logpush-granular-timestamps/<p>Logpush now supports higher-precision timestamp formats for log output. You can configure jobs to output timestamps at millisecond or nanosecond precision. This is available in both the Logpush UI in the Cloudflare dashboard and the <a href="https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/">Logpush API</a>.</p> <p>To use the new formats, set <code>timestamp_format</code> in your Logpush job's <code>output_options</code>:</p> <ul> <li><code>rfc3339ms</code> — <code>2024-02-17T23:52:01.123Z</code></li> <li><code>rfc3339ns</code> — <code>2024-02-17T23:52:01.123456789Z</code></li> </ul> <p>Default timestamp formats apply unless explicitly set. The dashboard defaults to <code>rfc3339</code> and the API defaults to <code>unixnano</code>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/log-output-options/">Log output options</a> documentation.</p>Wed, 25 Mar 2026 00:00:00 GMTlogpushlogpushLogsRules - New mTLS certificate fields for Transform Ruleshttps://developers.cloudflare.com/changelog/post/2026-03-25-rfc9440-mtls-fields/https://developers.cloudflare.com/changelog/post/2026-03-25-rfc9440-mtls-fields/<p>Cloudflare now exposes four new fields in the Transform Rules phase that encode client certificate data in <a href="https://www.rfc-editor.org/rfc/rfc9440" target="_blank" rel="noopener">RFC 9440<span class="external-link"> ↗</span></a> format. Previously, forwarding client certificate information to your origin required custom parsing of PEM-encoded fields or non-standard HTTP header formats. These new fields produce output in the standardized <code>Client-Cert</code> and <code>Client-Cert-Chain</code> header format defined by RFC 9440, so your origin can consume them directly without any additional decoding logic.</p> <p>Each certificate is DER-encoded, Base64-encoded, and wrapped in colons. For example, <code>:MIIDsT...Vw==:</code>. A chain of intermediates is expressed as a comma-separated list of such values.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields">New fields</h4><a class="anchor-link" href="#new-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>cf.tls_client_auth.cert_rfc9440</code></td> <td>String</td> <td>The client leaf certificate in RFC 9440 format. Empty if no client certificate was presented.</td> </tr> <tr> <td><code>cf.tls_client_auth.cert_rfc9440_too_large</code></td> <td>Boolean</td> <td><code>true</code> if the leaf certificate exceeded 10 KB and was omitted. In practice this will almost always be <code>false</code>.</td> </tr> <tr> <td><code>cf.tls_client_auth.cert_chain_rfc9440</code></td> <td>String</td> <td>The intermediate certificate chain in RFC 9440 format as a comma-separated list. Empty if no intermediate certificates were sent or if the chain exceeded 16 KB.</td> </tr> <tr> <td><code>cf.tls_client_auth.cert_chain_rfc9440_too_large</code></td> <td>Boolean</td> <td><code>true</code> if the intermediate chain exceeded 16 KB and was omitted.</td> </tr> </tbody> </table></div> <p>The chain encoding follows the same ordering as the TLS handshake: the certificate closest to the leaf appears first, working up toward the trust anchor. The root certificate is not included.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-forwarding-client-certificate-headers-to-your-origin-server">Example: Forwarding client certificate headers to your origin server</h4><a class="anchor-link" href="#example-forwarding-client-certificate-headers-to-your-origin-server"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Add a request header transform rule to set the <code>Client-Cert</code> and <code>Client-Cert-Chain</code> headers on requests forwarded to your origin server. For example, to forward headers for verified, non-revoked certificates:</p> <p><strong>Rule expression:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">cf.tls_client_auth.cert_verified and not cf.tls_client_auth.cert_revoked</span></span></code></pre></figure> <p><strong>Header modifications:</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Operation</th> <th>Header name</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>Set</td> <td><code>Client-Cert</code></td> <td><code>cf.tls_client_auth.cert_rfc9440</code></td> </tr> <tr> <td>Set</td> <td><code>Client-Cert-Chain</code></td> <td><code>cf.tls_client_auth.cert_chain_rfc9440</code></td> </tr> </tbody> </table></div> <p>To get the most out of these fields, upload your client CA certificate to Cloudflare so that Cloudflare validates the client certificate at the edge and populates <code>cf.tls_client_auth.cert_verified</code> and <code>cf.tls_client_auth.cert_revoked</code>.</p> <aside role="note" aria-label="Prevent header injection" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-warning); --_t: var(--nb-warning-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:warning"><path fill="currentColor" d="M236.8 188.09L149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19a23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2a7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12a12 12 0 0 1 12 12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Prevent header injection</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>You should ensure that <code>Client-Cert</code> and <code>Client-Cert-Chain</code> headers received by your origin server can only originate from this transform rule — any client could send these headers directly.</p><ul> <li><strong>If you use WAF custom rules to block requests with invalid mTLS connections:</strong> The transform rule is sufficient. For all requests that reach your origin server, the rule will overwrite any existing <code>Client-Cert</code> and <code>Client-Cert-Chain</code> headers.</li> <li><strong>If you do not enforce mTLS at the WAF:</strong> Add another transform rule that removes any incoming <code>Client-Cert</code> and <code>Client-Cert-Chain</code> headers from all requests (use expression <code>true</code>), ordered before the rule above. This ensures your origin server cannot receive client-supplied values for these HTTP headers.</li> </ul></div></div></aside> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/mutual-tls-authentication/">Mutual TLS authentication</a>, <a href="https://developers.cloudflare.com/rules/transform/request-header-modification/">Request Header Transform Rules</a>, and the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/">fields reference</a>.</p>Wed, 25 Mar 2026 00:00:00 GMTRulesRulesWorkers - Declare required secrets in your Wrangler configurationhttps://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/https://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/ <p>The new <code>secrets</code> configuration property lets you declare the secret names your Worker requires in your Wrangler configuration file. Required secrets are validated during local development and deploy, and used as the source of truth for type generation.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "secrets"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "required"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"API_KEY"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"DB_PASSWORD"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">secrets</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">required = [ </span><span class="nb-shiki-mdbnqw">"API_KEY"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"DB_PASSWORD"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="local-development">Local development</h4><a class="anchor-link" href="#local-development"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When <code>secrets</code> is defined, <code>wrangler dev</code> and <code>vite dev</code> load only the keys listed in <code>secrets.required</code> from <code>.dev.vars</code> or <code>.env</code>/<code>process.env</code>. Additional keys in those files are excluded. If any required secrets are missing, a warning is logged listing the missing names.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="type-generation">Type generation</h4><a class="anchor-link" href="#type-generation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>wrangler types</code> generates typed bindings from <code>secrets.required</code> instead of inferring names from <code>.dev.vars</code> or <code>.env</code>. This lets you run type generation in CI or other environments where those files are not present. Per-environment secrets are supported — the aggregated <code>Env</code> type marks secrets that only appear in some environments as optional.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deploy">Deploy</h4><a class="anchor-link" href="#deploy"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>wrangler deploy</code> and <code>wrangler versions upload</code> validate that all secrets in <code>secrets.required</code> are configured on the Worker before the operation succeeds. If any required secrets are missing, the command fails with an error listing which secrets need to be set.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#secrets-configuration-property"><code>secrets</code> configuration property</a> reference.</p>Wed, 25 Mar 2026 00:00:00 GMTWorkersWorkersAI Crawl Control - Advanced WAF customization for AI Crawl Control blockshttps://developers.cloudflare.com/changelog/post/2026-03-24-waf-rule-preservation/https://developers.cloudflare.com/changelog/post/2026-03-24-waf-rule-preservation/<p>AI Crawl Control now supports extending the underlying WAF rule with custom modifications. Any changes you make directly in the WAF custom rules editor — such as adding path-based exceptions, extra user agents, or additional expression clauses — are preserved when you update crawler actions in AI Crawl Control.</p> <p>If the WAF rule expression has been modified in a way AI Crawl Control cannot parse, a warning banner appears on the <strong>Crawlers</strong> page with a link to view the rule directly in WAF.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/#waf-rule-management">WAF rule management</a>.</p>Tue, 24 Mar 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlCache - Cache Response Ruleshttps://developers.cloudflare.com/changelog/post/2026-03-24-cache-response-rules/https://developers.cloudflare.com/changelog/post/2026-03-24-cache-response-rules/<p>You can now control how Cloudflare handles origin responses without changing your origin. Cache Response Rules let you modify <code>Cache-Control</code> directives, manage cache tags, and strip headers like <code>Set-Cookie</code> from origin responses <em>before</em> they reach Cloudflare's cache. Whether traffic is cached or passed through dynamically, these rules give you control over origin response behavior that was previously out of reach.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-changed">What changed</h4><a class="anchor-link" href="#what-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cache Rules previously only operated on request attributes. Cache Response Rules introduce a new response phase that evaluates origin responses and lets you act on them before caching. You can now:</p> <ul> <li><strong>Modify <code>Cache-Control</code> directives</strong>: Set or remove individual directives like <code>no-store</code>, <code>no-cache</code>, <code>max-age</code>, <code>s-maxage</code>, <code>stale-while-revalidate</code>, <code>immutable</code>, and more. For example, remove a <code>no-cache</code> directive your origin sends so Cloudflare can cache the asset, or set an <code>s-maxage</code> to control how long Cloudflare stores it.</li> <li><strong>Set a different browser <code>Cache-Control</code></strong>: Send a different <code>Cache-Control</code> header downstream to browsers and other clients than what Cloudflare uses internally, giving you independent control over edge and browser caching strategies.</li> <li><strong>Manage cache tags</strong>: Add, set, or remove cache tags on responses, including converting tags from another CDN's header format into Cloudflare's <code>Cache-Tag</code> header. This is especially useful if you are migrating from a CDN that uses a different tag header or delimiter.</li> <li><strong>Strip headers that block caching</strong>: Remove <code>Set-Cookie</code>, <code>ETag</code>, or <code>Last-Modified</code> headers from origin responses before caching, so responses that would otherwise be treated as uncacheable can be stored and served from cache.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>No origin changes required</strong>: Fix caching behavior entirely from Cloudflare, even when your origin configuration is locked down or managed by a different team.</li> <li><strong>Simpler CDN migration</strong>: Match caching behavior from other CDN providers without rewriting your origin. Translate cache tag formats and override directives that do not align with Cloudflare's defaults.</li> <li><strong>Native support, fewer workarounds</strong>: Functionality that previously required workarounds is now built into Cache Rules with full Tiered Cache compatibility.</li> <li><strong>Fine-grained control</strong>: Use expressions to match on request and response attributes, then apply precise cache settings per rule. Rules are stackable and composable with existing Cache Rules.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Configure Cache Response Rules in the <a href="https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> under <strong>Caching</strong> &gt; <strong>Cache Rules</strong>, or via the <a href="https://developers.cloudflare.com/ruleset-engine/rulesets-api/" target="_blank" rel="noopener">Rulesets API<span class="external-link"> ↗</span></a>. For more details, refer to the <a href="https://developers.cloudflare.com/cache/how-to/cache-response-rules/" target="_blank" rel="noopener">Cache Rules documentation<span class="external-link"> ↗</span></a>.</p>Tue, 24 Mar 2026 00:00:00 GMTCacheCacheContainers - Use Docker Hub images with Containershttps://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/ <p>Containers now support <a href="https://hub.docker.com/" target="_blank" rel="noopener">Docker Hub<span class="external-link"> ↗</span></a> images. You can use a fully qualified Docker Hub image reference in your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#containers" target="_blank" rel="noopener">Wrangler configuration<span class="external-link"> ↗</span></a> instead of first pushing the image to Cloudflare Registry.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Example: docker.io/cloudflare/sandbox:0.7.18</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "image"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"docker.io/&#x3C;NAMESPACE>/&#x3C;REPOSITORY>:&#x3C;TAG>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">image = </span><span class="nb-shiki-mdbnqw">"docker.io/&#x3C;NAMESPACE>/&#x3C;REPOSITORY>:&#x3C;TAG>"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Containers also support private Docker Hub images. To configure credentials, refer to <a href="https://developers.cloudflare.com/containers/platform-details/image-management/#use-private-docker-hub-images">Use private Docker Hub images</a>.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/containers/platform-details/image-management/">Image management</a>.</p>Tue, 24 Mar 2026 00:00:00 GMTContainersContainersGateway - OIDC Claims filtering now available in Gateway Firewall, Resolver, and Egress policieshttps://developers.cloudflare.com/changelog/post/2026-03-24-oidc-claims-filtering-gateway-policies/https://developers.cloudflare.com/changelog/post/2026-03-24-oidc-claims-filtering-gateway-policies/<p>Cloudflare Gateway now supports <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/#oidc-claims">OIDC Claims</a> as a selector in Firewall, Resolver, and Egress policies. Administrators can use custom OIDC claims from their identity provider to build fine-grained, identity-based traffic policies across all Gateway policy types.</p> <p>With this update, you can:</p> <ul> <li>Filter traffic in <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/">DNS</a>, <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP</a>, and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network</a> firewall policies based on OIDC claim values.</li> <li>Apply custom <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/">resolver policies</a> to route DNS queries to specific resolvers depending on a user's OIDC claims.</li> <li>Control <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/">egress policies</a> to assign dedicated egress IPs based on OIDC claim attributes.</li> </ul> <p>For example, you can create a policy that routes traffic differently for users with <code>department=engineering</code> in their OIDC claims, or restrict access to certain destinations based on a user's role claim.</p> <p>To get started, configure <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/generic-oidc/#custom-oidc-claims">custom OIDC claims</a> on your identity provider and use the <strong>OIDC Claims</strong> selector in the Gateway policy builder.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/">Identity-based policies</a>.</p>Tue, 24 Mar 2026 00:00:00 GMTGatewayGatewayNetwork Interconnect - Interconnects moved to Connectorshttps://developers.cloudflare.com/changelog/post/2026-03-24-interconnects-navigation-update/https://developers.cloudflare.com/changelog/post/2026-03-24-interconnects-navigation-update/<p>The top-level <strong>Interconnects</strong> page in the Cloudflare dashboard has been removed. Interconnects are now located under <strong>Connectors</strong> &gt; <strong>Interconnects</strong>.</p> <p>Your existing configurations and functionality remain the same.</p>Tue, 24 Mar 2026 00:00:00 GMTNetwork InterconnectNetwork InterconnectWorkers - Dynamic Workers, now in open betahttps://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/https://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/ <p><a href="https://developers.cloudflare.com/dynamic-workers/">Dynamic Workers</a> are now in <a href="https://blog.cloudflare.com/dynamic-workers/" target="_blank" rel="noopener">open beta<span class="external-link"> ↗</span></a> for all paid Workers users. You can now have a Worker spin up other Workers, called Dynamic Workers, at runtime to execute code on-demand in a secure, sandboxed environment. Dynamic Workers start in milliseconds, making them well suited for fast, secure code execution at scale.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="use-dynamic-workers-for">Use Dynamic Workers for</h4><a class="anchor-link" href="#use-dynamic-workers-for"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong><a href="https://developers.cloudflare.com/agents/tools/codemode/">Code Mode</a></strong>: LLMs are trained to write code. Run tool-calling logic written in code instead of stepping through many tool calls, which can save up to 80% in inference tokens and cost.</li> <li><strong>AI agents executing code</strong>: Run code for tasks like data analysis, file transformation, API calls, and chained actions.</li> <li><strong>Running AI-generated code</strong>: Run generated code for prototypes, projects, and automations in a secure, isolated sandboxed environment.</li> <li><strong>Fast development and previews</strong>: Load prototypes, previews, and playgrounds in milliseconds.</li> <li><strong>Custom automations</strong>: Create custom tools on the fly that execute a task, call an integration, or automate a workflow.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="executing-dynamic-workers">Executing Dynamic Workers</h4><a class="anchor-link" href="#executing-dynamic-workers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Dynamic Workers support two loading modes:</p> <ul> <li><code>load(code)</code> — for one-time code execution (equivalent to calling <code>get()</code> with a null ID).</li> <li><code>get(id, callback)</code> — caches a Dynamic Worker by ID so it can stay warm across requests. Use this when the same code will receive subsequent requests.</li> </ul> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> worker</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">load</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> compatibilityDate: </span><span class="nb-shiki-mdbnqw">"2026-01-01"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> mainModule: </span><span class="nb-shiki-mdbnqw">"src/index.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "src/index.js"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">`</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> export default {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> fetch() {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> return new Response("Hello from a dynamic Worker");</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> };</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Block all outbound network access from the Dynamic Worker.</span></span> <span class="line"><span class="nb-shiki-140thh"> globalOutbound: </span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> worker.</span><span class="nb-shiki-1t8gfj">getEntrypoint</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> worker</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">load</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> compatibilityDate: </span><span class="nb-shiki-mdbnqw">"2026-01-01"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> mainModule: </span><span class="nb-shiki-mdbnqw">"src/index.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "src/index.js"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">`</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> export default {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> fetch() {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> return new Response("Hello from a dynamic Worker");</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> };</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Block all outbound network access from the Dynamic Worker.</span></span> <span class="line"><span class="nb-shiki-140thh"> globalOutbound: </span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> worker.</span><span class="nb-shiki-1t8gfj">getEntrypoint</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="helper-libraries-for-dynamic-workers">Helper libraries for Dynamic Workers</h4><a class="anchor-link" href="#helper-libraries-for-dynamic-workers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Here are 3 new libraries to help you build with Dynamic Workers:</p> <ul> <li> <p><strong><a href="https://www.npmjs.com/package/@cloudflare/codemode" target="_blank" rel="noopener"><code>@cloudflare/codemode</code><span class="external-link"> ↗</span></a></strong>: Replace individual tool calls with a single <code>code()</code> tool, so LLMs write and execute TypeScript that orchestrates multiple API calls in one pass.</p> </li> <li> <p><strong><a href="https://www.npmjs.com/package/@cloudflare/worker-bundler" target="_blank" rel="noopener"><code>@cloudflare/worker-bundler</code><span class="external-link"> ↗</span></a></strong>: Resolve npm dependencies and bundle source files into ready-to-load modules for Dynamic Workers, all at runtime.</p> </li> <li> <p><strong><a href="https://www.npmjs.com/package/@cloudflare/shell" target="_blank" rel="noopener"><code>@cloudflare/shell</code><span class="external-link"> ↗</span></a></strong>: Give your agent a virtual filesystem inside a Dynamic Worker with persistent storage backed by SQLite and R2.</p> </li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="try-it-out">Try it out</h4><a class="anchor-link" href="#try-it-out"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Dynamic Workers Starter</strong></p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Workers"></a></p> <p>Use this <a href="https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers" target="_blank" rel="noopener">starter<span class="external-link"> ↗</span></a> to deploy a Worker that can load and execute Dynamic Workers.</p> <p><strong>Dynamic Workers Playground</strong></p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Workers"></a></p> <p>Deploy the <a href="https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground" target="_blank" rel="noopener">Dynamic Workers Playground<span class="external-link"> ↗</span></a> to write or import code, bundle it at runtime with <code>@cloudflare/worker-bundler</code>, execute it through a Dynamic Worker, and see real-time responses and execution logs.</p> <p>For the full API reference and configuration options, refer to the <a href="https://developers.cloudflare.com/dynamic-workers/">Dynamic Workers documentation</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pricing">Pricing</h4><a class="anchor-link" href="#pricing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Dynamic Workers <a href="https://developers.cloudflare.com/dynamic-workers/pricing/">pricing</a> is based on three dimensions: Dynamic Workers created daily, requests, and CPU time.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th></th> <th>Included</th> <th>Additional usage</th> </tr> </thead> <tbody> <tr> <td><strong>Dynamic Workers created daily</strong></td> <td>1,000 unique Dynamic Workers per month</td> <td>+$0.002 per Dynamic Worker per day</td> </tr> <tr> <td><strong>Requests</strong> ¹</td> <td>10 million per month</td> <td>+$0.30 per million requests</td> </tr> <tr> <td><strong>CPU time</strong> ¹</td> <td>30 million CPU milliseconds per month</td> <td>+$0.02 per million CPU milliseconds</td> </tr> </tbody> </table></div> <p>¹ Uses <a href="https://developers.cloudflare.com/workers/platform/pricing/#workers">Workers Standard rates</a> and will appear as part of your existing Workers bill, not as separate Dynamic Workers charges.</p> <p>Note: Dynamic Workers requests and CPU time are already billed as part of your Workers plan and will count toward your Workers requests and CPU usage. The Dynamic Workers created daily charge is not yet active — you will not be billed for the number of Dynamic Workers created at this time. Pricing information is shared in advance so you can estimate future costs.</p>Tue, 24 Mar 2026 00:00:00 GMTWorkersWorkersWorkflows, Workers - Workflow instances now support pause(), resume(), restart(), and terminate() methods in local developmenthttps://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/https://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/<p>Workflow instance methods <code>pause()</code>, <code>resume()</code>, <code>restart()</code>, and <code>terminate()</code> are now available in local development when using <code>wrangler dev</code>.</p> <p>You can now test the full Workflow instance lifecycle locally:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_WORKFLOW</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> id: </span><span class="nb-shiki-mdbnqw">"my-instance-id"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">pause</span><span class="nb-shiki-140thh">(); </span><span class="nb-shiki-21nrsd">// pauses a running workflow instance</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">resume</span><span class="nb-shiki-140thh">(); </span><span class="nb-shiki-21nrsd">// resumes a paused instance</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">restart</span><span class="nb-shiki-140thh">(); </span><span class="nb-shiki-21nrsd">// restarts the instance from the beginning</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">terminate</span><span class="nb-shiki-140thh">(); </span><span class="nb-shiki-21nrsd">// terminates the instance immediately</span></span></code></pre></figure>Mon, 23 Mar 2026 12:00:00 GMTWorkflowsWorkflowsWorkersAgents, Workers - Agents SDK v0.8.0: readable state, idempotent schedules, typed AgentClient, and Zod 4https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v0.8.0/https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v0.8.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> exposes agent state as a readable property, prevents duplicate schedule rows across Durable Object restarts, brings full TypeScript inference to <code>AgentClient</code>, and migrates to Zod 4.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="readable-state-on-useagent-and-agentclient">Readable <code>state</code> on <code>useAgent</code> and <code>AgentClient</code></h4><a class="anchor-link" href="#readable-state-on-useagent-and-agentclient"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Both <code>useAgent</code> (React) and <code>AgentClient</code> (vanilla JS) now expose a <code>state</code> property that reflects the current agent state. Previously, reading state required manually tracking it through the <code>onStateUpdate</code> callback.</p> <p><strong>React (<code>useAgent</code>)</strong></p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"game-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"room-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Read state directly — no separate useState + onStateUpdate needed</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> &#x3C;</span><span class="nb-shiki-17hn0y">div</span><span class="nb-shiki-140thh">>Score: {agent.state?.score}&#x3C;/</span><span class="nb-shiki-17hn0y">div</span><span class="nb-shiki-140thh">>;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Spread for partial updates</span></span> <span class="line"><span class="nb-shiki-140thh">agent.</span><span class="nb-shiki-1t8gfj">setState</span><span class="nb-shiki-140thh">({ </span><span class="nb-shiki-1itgoe">...</span><span class="nb-shiki-140thh">agent.state, score: (agent.state?.score </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-dzsirb"> 10</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="tsx"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tsx" data-nb-lang="tsx"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">GameAgent</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">GameState</span><span class="nb-shiki-140thh">&gt;({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"game-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"room-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Read state directly — no separate useState + onStateUpdate needed</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> &lt;</span><span class="nb-shiki-17hn0y">div</span><span class="nb-shiki-140thh">&gt;Score: {agent.state?.score}&lt;/</span><span class="nb-shiki-17hn0y">div</span><span class="nb-shiki-140thh">&gt;;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Spread for partial updates</span></span> <span class="line"><span class="nb-shiki-140thh">agent.</span><span class="nb-shiki-1t8gfj">setState</span><span class="nb-shiki-140thh">({ </span><span class="nb-shiki-1itgoe">...</span><span class="nb-shiki-140thh">agent.state, score: (agent.state?.score </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-dzsirb"> 10</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p><code>agent.state</code> is reactive — the component re-renders when state changes from either the server or a client-side <code>setState()</code> call.</p> <p><strong>Vanilla JS (<code>AgentClient</code>)</strong></p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"game-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"room-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: </span><span class="nb-shiki-mdbnqw">"your-worker.workers.dev"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">client.</span><span class="nb-shiki-1t8gfj">setState</span><span class="nb-shiki-140thh">({ score: </span><span class="nb-shiki-dzsirb">100</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(client.state); </span><span class="nb-shiki-21nrsd">// { score: 100 }</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">GameAgent</span><span class="nb-shiki-140thh">&gt;({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"game-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"room-123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: </span><span class="nb-shiki-mdbnqw">"your-worker.workers.dev"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">client.</span><span class="nb-shiki-1t8gfj">setState</span><span class="nb-shiki-140thh">({ score: </span><span class="nb-shiki-dzsirb">100</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(client.state); </span><span class="nb-shiki-21nrsd">// { score: 100 }</span></span></code></pre></figure></div></div></div></div> <p>State starts as <code>undefined</code> and is populated when the server sends the initial state on connect (from <code>initialState</code>) or when <code>setState()</code> is called. Use optional chaining (<code>agent.state?.field</code>) for safe access. The <code>onStateUpdate</code> callback continues to work as before — the new <code>state</code> property is additive.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="idempotent-schedule">Idempotent <code>schedule()</code></h4><a class="anchor-link" href="#idempotent-schedule"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>schedule()</code> now supports an <code>idempotent</code> option that deduplicates by <code>(type, callback, payload)</code>, preventing duplicate rows from accumulating when called in places that run on every Durable Object restart such as <code>onStart()</code>.</p> <p><strong>Cron schedules are idempotent by default.</strong> Calling <code>schedule("0 * * * *", "tick")</code> multiple times with the same callback, expression, and payload returns the existing schedule row instead of creating a new one. Pass <code>{ idempotent: false }</code> to override.</p> <p>Delayed and date-scheduled types support opt-in idempotency:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Safe across restarts — only one row is created</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">schedule</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">60</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"maintenance"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">undefined</span><span class="nb-shiki-140thh">, { idempotent: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Safe across restarts — only one row is created</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">schedule</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">60</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"maintenance"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">undefined</span><span class="nb-shiki-140thh">, { idempotent: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Two new warnings help catch common foot-guns:</p> <ul> <li>Calling <code>schedule()</code> inside <code>onStart()</code> without <code>{ idempotent: true }</code> emits a <code>console.warn</code> with actionable guidance (once per callback; skipped for cron and when <code>idempotent</code> is set explicitly).</li> <li>If an alarm cycle processes 10 or more stale one-shot rows for the same callback, the SDK emits a <code>console.warn</code> and a <code>schedule:duplicate_warning</code> diagnostics channel event.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="typed-agentclient-with-call-inference-and-stub-proxy">Typed <code>AgentClient</code> with <code>call</code> inference and <code>stub</code> proxy</h4><a class="anchor-link" href="#typed-agentclient-with-call-inference-and-stub-proxy"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>AgentClient</code> now accepts an optional agent type parameter for full type inference on RPC calls, matching the typed experience already available with <code>useAgent</code>.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"my-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: window.location.host,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Typed call — method name autocompletes, args and return type inferred</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.</span><span class="nb-shiki-1t8gfj">call</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"getValue"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Typed stub — direct RPC-style proxy</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> client.stub.</span><span class="nb-shiki-1t8gfj">getValue</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> client.stub.</span><span class="nb-shiki-1t8gfj">add</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">MyAgent</span><span class="nb-shiki-140thh">&gt;({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"my-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: window.location.host,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Typed call — method name autocompletes, args and return type inferred</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.</span><span class="nb-shiki-1t8gfj">call</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"getValue"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Typed stub — direct RPC-style proxy</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> client.stub.</span><span class="nb-shiki-1t8gfj">getValue</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> client.stub.</span><span class="nb-shiki-1t8gfj">add</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div></div> <p>State is automatically inferred from the agent type, so <code>onStateUpdate</code> is also typed:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"my-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: window.location.host,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStateUpdate</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">state</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // state is typed as MyAgent's state type</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> AgentClient</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">MyAgent</span><span class="nb-shiki-140thh">&gt;({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent: </span><span class="nb-shiki-mdbnqw">"my-agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> host: window.location.host,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStateUpdate</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">state</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // state is typed as MyAgent's state type</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Existing untyped usage continues to work without changes. The RPC type utilities (<code>AgentMethods</code>, <code>AgentStub</code>, <code>RPCMethods</code>) are now exported from <code>agents/client</code> for advanced typing scenarios. <code>agents</code>, <code>@cloudflare/ai-chat</code>, and <code>@cloudflare/codemode</code> now require <code>zod ^4.0.0</code>. Zod v3 is no longer supported.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflareai-chat-fixes"><code>@cloudflare/ai-chat</code> fixes</h4><a class="anchor-link" href="#cloudflareai-chat-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Turn serialization</strong> — <code>onChatMessage()</code> and <code>_reply()</code> work is now queued so user requests, tool continuations, and <code>saveMessages()</code> never stream concurrently.</li> <li><strong>Duplicate messages on stop</strong> — Clicking stop during an active stream no longer splits the assistant message into two entries.</li> <li><strong>Duplicate messages after tool calls</strong> — Orphaned client IDs no longer leak into persistent storage.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="keepalive-and-keepalivewhile-are-no-longer-experimental"><code>keepAlive()</code> and <code>keepAliveWhile()</code> are no longer experimental</h4><a class="anchor-link" href="#keepalive-and-keepalivewhile-are-no-longer-experimental"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>keepAlive()</code> now uses a lightweight in-memory ref count instead of schedule rows. Multiple concurrent callers share a single alarm cycle. The <code>@experimental</code> tag has been removed from both <code>keepAlive()</code> and <code>keepAliveWhile()</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflarecodemode-tanstack-ai-integration"><code>@cloudflare/codemode</code>: TanStack AI integration</h4><a class="anchor-link" href="#cloudflarecodemode-tanstack-ai-integration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new entry point <code>@cloudflare/codemode/tanstack-ai</code> adds support for <a href="https://tanstack.com/ai" target="_blank" rel="noopener">TanStack AI's<span class="external-link"> ↗</span></a> <code>chat()</code> as an alternative to the Vercel AI SDK's <code>streamText()</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> createCodeTool,</span></span> <span class="line"><span class="nb-shiki-140thh"> tanstackTools,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/tanstack-ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { chat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@tanstack/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> codeTool</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodeTool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: [</span><span class="nb-shiki-1t8gfj">tanstackTools</span><span class="nb-shiki-140thh">(myServerTools)],</span></span> <span class="line"><span class="nb-shiki-140thh"> executor,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> chat</span><span class="nb-shiki-140thh">({ adapter, tools: [codeTool], messages });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createCodeTool, tanstackTools } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/tanstack-ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { chat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@tanstack/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> codeTool</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodeTool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: [</span><span class="nb-shiki-1t8gfj">tanstackTools</span><span class="nb-shiki-140thh">(myServerTools)],</span></span> <span class="line"><span class="nb-shiki-140thh"> executor,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> chat</span><span class="nb-shiki-140thh">({ adapter, tools: [codeTool], messages });</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/ai-chat@latest</span></span></code></pre></figure>Mon, 23 Mar 2026 00:00:00 GMTAgentsAgentsWorkersAI Search - New AI Search REST API endpoints for /search and /chat/completionshttps://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now offers new <a href="https://developers.cloudflare.com/ai-search/api/search/rest-api/">REST API</a> endpoints for search and chat that use an OpenAI compatible format. This means you can use the familiar <code>messages</code> array structure that works with existing OpenAI SDKs and tools. The messages array also lets you pass previous messages within a session, so the model can maintain context across multiple turns.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Endpoint</th> <th>Path</th> </tr> </thead> <tbody> <tr> <td>Chat Completions</td> <td><code>POST /accounts/{account_id}/ai-search/instances/{name}/chat/completions</code></td> </tr> <tr> <td>Search</td> <td><code>POST /accounts/{account_id}/ai-search/instances/{name}/search</code></td> </tr> </tbody> </table></div> <p>Here is an example request to the Chat Completions endpoint using the new <code>messages</code> array format:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/chat/completions</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {API_TOKEN}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "system",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "You are a helpful documentation assistant."</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "How do I get started?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>For more details, refer to the <a href="https://developers.cloudflare.com/ai-search/api/search/rest-api/">AI Search REST API guide</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="migration-from-existing-autorag-api-recommended">Migration from existing AutoRAG API (recommended)</h4><a class="anchor-link" href="#migration-from-existing-autorag-api-recommended"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are using the previous AutoRAG API endpoints (<code>/autorag/rags/</code>), we recommend migrating to the new endpoints. The previous AutoRAG API endpoints will continue to be fully supported.</p> <p>Refer to the <a href="https://developers.cloudflare.com/ai-search/api/migration/rest-api/">migration guide</a> for step-by-step instructions.</p>Mon, 23 Mar 2026 00:00:00 GMTAI SearchAI SearchAI Search - AI Search UI snippets and MCP supporthttps://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/ <p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports public endpoints, UI snippets, and MCP, making it easy to add search to your website or connect AI agents.</p> <p>Public endpoints allow you to expose AI Search capabilities without requiring API authentication. To enable public endpoints:</p> <ol><li>Go to <strong>AI Search</strong> in the Cloudflare dashboard. <a href="https://dash.cloudflare.com/?to=/:account/ai/ai-search" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>AI Search</strong>&nbsp;&#8599;</a></li> <li>Select your instance, and turn on <strong>Public Endpoint</strong> in <strong>Settings</strong>. For more details, refer to <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/">Public endpoint configuration</a>.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ui-snippets">UI snippets</h4><a class="anchor-link" href="#ui-snippets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>UI snippets are pre-built search and chat components you can embed in your website. Visit <a href="https://search.ai.cloudflare.com/" target="_blank" rel="noopener">search.ai.cloudflare.com<span class="external-link"> ↗</span></a> to configure and preview components for your AI Search instance.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1842,height=806,format=webp/_astro/ui-snippet-search-modal.nSXbvcsi.png" alt="Example of the search-modal-snippet component" loading="lazy" decoding="async" width="1842" height="806"> <p>To add a search modal to your page:</p> <figure class="nb-code-figure" data-nb-lang="html"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="html" data-nb-lang="html"><code><span class="line"><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-17hn0y">script</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> type</span><span class="nb-shiki-140thh">=</span><span class="nb-shiki-mdbnqw">"module"</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> src</span><span class="nb-shiki-140thh">=</span><span class="nb-shiki-mdbnqw">"https://&lt;PUBLIC_ENDPOINT_ID&gt;.search.ai.cloudflare.com/assets/v0.0.25/search-snippet.es.js"</span></span> <span class="line"><span class="nb-shiki-140thh">&gt;&lt;/</span><span class="nb-shiki-17hn0y">script</span><span class="nb-shiki-140thh">&gt;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-17hn0y">search-modal-snippet</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> api-url</span><span class="nb-shiki-140thh">=</span><span class="nb-shiki-mdbnqw">"https://</span><span class="nb-shiki-2bbn9v">&lt;</span><span class="nb-shiki-mdbnqw">PUBLIC_ENDPOINT_ID&gt;.search.ai.cloudflare.com/"</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> placeholder</span><span class="nb-shiki-140thh">=</span><span class="nb-shiki-mdbnqw">"Search..."</span></span> <span class="line"><span class="nb-shiki-140thh">&gt;</span></span> <span class="line"><span class="nb-shiki-140thh">&lt;/</span><span class="nb-shiki-17hn0y">search-modal-snippet</span><span class="nb-shiki-140thh">&gt;</span></span></code></pre></figure> <p>For more details, refer to the <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/embed-search-snippets/">UI snippets documentation</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp">MCP</h4><a class="anchor-link" href="#mcp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The MCP endpoint allows AI agents to search your content via the Model Context Protocol. Connect your MCP client to:</p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">https://&lt;PUBLIC_ENDPOINT_ID&gt;.search.ai.cloudflare.com/mcp</span></span></code></pre></figure> <p>For more details, refer to the <a href="https://developers.cloudflare.com/ai-search/api/search/mcp/">MCP documentation</a>.</p>Mon, 23 Mar 2026 00:00:00 GMTAI SearchAI SearchAI Search - Custom metadata filtering for AI Searchhttps://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/https://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports custom metadata filtering, allowing you to define your own metadata fields and filter search results based on attributes like category, version, or any custom field you define.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="define-a-custom-metadata-schema">Define a custom metadata schema</h4><a class="anchor-link" href="#define-a-custom-metadata-schema"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can define up to 5 custom metadata fields per AI Search instance. Each field has a name and data type (<code>text</code>, <code>number</code>, or <code>boolean</code>):</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {API_TOKEN}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "id": "my-instance",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "r2",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source": "my-bucket",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "custom_metadata": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> { "field_name": "category", "data_type": "text" },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> { "field_name": "version", "data_type": "number" },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> { "field_name": "is_public", "data_type": "boolean" }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="add-metadata-to-your-documents">Add metadata to your documents</h4><a class="anchor-link" href="#add-metadata-to-your-documents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>How you attach metadata depends on your data source:</p> <ul> <li><strong>R2 bucket</strong>: Set metadata using S3-compatible custom headers (<code>x-amz-meta-*</code>) when uploading objects. Refer to <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#custom-metadata">R2 custom metadata</a> for examples.</li> <li><strong>Website</strong>: Add <code>&lt;meta&gt;</code> tags to your HTML pages. Refer to <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/custom-metadata/">Website custom metadata</a> for details.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="filter-search-results">Filter search results</h4><a class="anchor-link" href="#filter-search-results"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use custom metadata fields in your search queries alongside built-in attributes like <code>folder</code> and <code>timestamp</code>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/search</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {API_TOKEN}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "How do I configure authentication?",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ],</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ai_search_options": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "retrieval": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "filters": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "category": "documentation",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "version": { "$gte": 2.0 }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>Learn more in the <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/">metadata filtering documentation</a>.</p>Mon, 23 Mar 2026 00:00:00 GMTAI SearchAI SearchAPI Shield - Web Assets fields now available in GraphQL Analytics APIhttps://developers.cloudflare.com/changelog/post/2026-03-23-web-assets-graphql-fields/https://developers.cloudflare.com/changelog/post/2026-03-23-web-assets-graphql-fields/<p>Two new fields are now available in the <code>httpRequestsAdaptive</code> and <code>httpRequestsAdaptiveGroups</code> <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL Analytics API</a> datasets:</p> <ul> <li><code>webAssetsOperationId</code> — the ID of the <a href="https://developers.cloudflare.com/api-shield/management-and-monitoring/">saved endpoint</a> that matched the incoming request.</li> <li><code>webAssetsLabelsManaged</code> — the <a href="https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#managed-labels">managed labels</a> mapped to the matched operation at the time of the request (for example, <code>cf-llm</code>, <code>cf-log-in</code>). At most 10 labels are returned per request.</li> </ul> <p>Both fields are empty when no operation matched. <code>webAssetsLabelsManaged</code> is also empty when no managed labels are assigned to the matched operation.</p> <p>These fields allow you to determine, per request, which Web Assets operation was matched and which managed labels were active. This is useful for troubleshooting downstream security detection verdicts — for example, understanding why <a href="https://developers.cloudflare.com/waf/detections/ai-security-for-apps/">AI Security for Apps</a> did or did not flag a request.</p> <p>Refer to <a href="https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#analytics">Endpoint labeling service</a> for GraphQL query examples.</p>Mon, 23 Mar 2026 00:00:00 GMTAPI ShieldAPI ShieldR2 SQL - R2 SQL now supports over 190 new functions, expressions, and complex typeshttps://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/<p><a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a> now supports an expanded SQL grammar so you can write richer analytical queries without exporting data. This release adds CASE expressions, column aliases, arithmetic in clauses, 163 scalar functions, 33 aggregate functions, EXPLAIN, Common Table Expressions (CTEs),and full struct/array/map access. R2 SQL is Cloudflare's serverless, distributed, analytics query engine for querying <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables stored in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>. This page documents the supported SQL syntax.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="highlights">Highlights</h4><a class="anchor-link" href="#highlights"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Column aliases</strong> — <code>SELECT col AS alias</code> now works in all clauses</li> <li><strong>CASE expressions</strong> — conditional logic directly in SQL (searched and simple forms)</li> <li><strong>Scalar functions</strong> — 163 new functions across math, string, datetime, regex, crypto, encoding, and type inspection categories</li> <li><strong>Aggregate functions</strong> — statistical (variance, stddev, correlation, regression), bitwise, boolean, and positional aggregates join the existing basic and approximate functions</li> <li><strong>Complex types</strong> — query struct fields with bracket notation, use 46 array functions, and extract map keys/values</li> <li><strong>Common table expressions (CTEs)</strong> — use <code>WITH ... AS</code> to define named temporary result sets. Chained CTEs are supported. All CTEs must reference the same single table.</li> <li><strong>Full expression support</strong> — arithmetic, type casting (<code>CAST</code>, <code>TRY_CAST</code>, <code>::</code> shorthand), and <code>EXTRACT</code> in SELECT, WHERE, GROUP BY, HAVING, and ORDER BY</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="case-expressions-with-statistical-aggregates">CASE expressions with statistical aggregates</h4><a class="anchor-link" href="#case-expressions-with-statistical-aggregates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> source,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> CASE</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHEN</span><span class="nb-shiki-dzsirb"> AVG</span><span class="nb-shiki-140thh">(price) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 30</span><span class="nb-shiki-1itgoe"> THEN</span><span class="nb-shiki-mdbnqw"> 'premium'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHEN</span><span class="nb-shiki-dzsirb"> AVG</span><span class="nb-shiki-140thh">(price) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 10</span><span class="nb-shiki-1itgoe"> THEN</span><span class="nb-shiki-mdbnqw"> 'mid-tier'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> ELSE</span><span class="nb-shiki-mdbnqw"> 'budget'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> END</span><span class="nb-shiki-1itgoe"> AS</span><span class="nb-shiki-140thh"> tier,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> round</span><span class="nb-shiki-140thh">(stddev(price), </span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> price_volatility,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> approx_percentile_cont</span><span class="nb-shiki-140thh">(price, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">95</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> p95_price</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> source</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="struct-and-array-access">Struct and array access</h4><a class="anchor-link" href="#struct-and-array-access"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> product_name,</span></span> <span class="line"><span class="nb-shiki-140thh"> pricing['price'] </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> price,</span></span> <span class="line"><span class="nb-shiki-140thh"> array_to_string(tags, </span><span class="nb-shiki-mdbnqw">', '</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> tag_list</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">products</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> array_has(tags, </span><span class="nb-shiki-mdbnqw">'Action'</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-140thh"> pricing['price'] </span><span class="nb-shiki-1itgoe">DESC</span></span> <span class="line"><span class="nb-shiki-1itgoe">LIMIT</span><span class="nb-shiki-dzsirb"> 10</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="chained-ctes-with-time-series-analysis">Chained CTEs with time-series analysis</h4><a class="anchor-link" href="#chained-ctes-with-time-series-analysis"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">WITH</span><span class="nb-shiki-140thh"> monthly </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> SELECT</span><span class="nb-shiki-140thh"> date_trunc(</span><span class="nb-shiki-mdbnqw">'month'</span><span class="nb-shiki-140thh">, sale_timestamp) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-1itgoe"> month</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> department,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> transactions,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> round</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">AVG</span><span class="nb-shiki-140thh">(total_amount), </span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> avg_amount</span></span> <span class="line"><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-140thh"> sale_timestamp </span><span class="nb-shiki-1itgoe">BETWEEN</span><span class="nb-shiki-mdbnqw"> '2025-01-01T00:00:00Z'</span><span class="nb-shiki-1itgoe"> AND</span><span class="nb-shiki-mdbnqw"> '2025-12-31T23:59:59Z'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> GROUP BY</span><span class="nb-shiki-140thh"> date_trunc(</span><span class="nb-shiki-mdbnqw">'month'</span><span class="nb-shiki-140thh">, sale_timestamp), department</span></span> <span class="line"><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh">ranked </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> SELECT</span><span class="nb-shiki-1itgoe"> month</span><span class="nb-shiki-140thh">, department, transactions, avg_amount,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> CASE</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHEN</span><span class="nb-shiki-140thh"> avg_amount </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-1itgoe"> THEN</span><span class="nb-shiki-mdbnqw"> 'high-value'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHEN</span><span class="nb-shiki-140thh"> avg_amount </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 500</span><span class="nb-shiki-1itgoe"> THEN</span><span class="nb-shiki-mdbnqw"> 'mid-value'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> ELSE</span><span class="nb-shiki-mdbnqw"> 'standard'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> END</span><span class="nb-shiki-1itgoe"> AS</span><span class="nb-shiki-140thh"> tier</span></span> <span class="line"><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-140thh"> monthly</span></span> <span class="line"><span class="nb-shiki-1itgoe"> WHERE</span><span class="nb-shiki-140thh"> transactions </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 100</span></span> <span class="line"><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-1itgoe"> FROM</span><span class="nb-shiki-140thh"> ranked</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-1itgoe"> month</span><span class="nb-shiki-140thh">, avg_amount </span><span class="nb-shiki-1itgoe">DESC</span></span></code></pre></figure> <p>For the full function reference and syntax details, refer to the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. For limitations and best practices, refer to <a href="https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/">Limitations and best practices</a>.</p>Mon, 23 Mar 2026 00:00:00 GMTR2 SQLR2 SQLWAF - WAF Release - 2026-03-23https://developers.cloudflare.com/changelog/post/2026-03-23-waf-release/https://developers.cloudflare.com/changelog/post/2026-03-23-waf-release/ <p>This week's release focuses on new improvements to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54ad0465c30d4cd2ac7a707197321c6c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...97321c6c</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Command Injection - Generic 9 - URI Vector</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b31c34a7b29b4aaf9be6883d1eb7a999"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1eb7a999</span></button></rule-id></td><p><td>N/A</td> <td>Command Injection - Generic 9 - Header Vector</td> <td>Log</td> <td>Disabled</td><br> <td>This is a new detection.</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="155bb67d1061479e995a38510677175f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0677175f</span></button></rule-id></td><p><td>N/A</td> <td>Command Injection - Generic 9 - Body Vector</td> <td>Log</td> <td>Disabled</td><br> <td>This is a new detection.</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="55fb1c76f0304f6a9d935d03479da68f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...479da68f</span></button></rule-id></td><td>N/A</td><td>PHP, vBulletin, jQuery File Upload - Code Injection, Dangerous File Upload - CVE:CVE-2018-9206, CVE:CVE-2019-17132 (beta)</td><td>Log</td><td>Block</td><td>This rule has been merged into the original rule "PHP, vBulletin, jQuery File Upload - Code Injection, Dangerous File Upload - CVE:CVE-2018-9206, CVE:CVE-2019-17132" (ID: <rule-id id="0f2da91cec674eb58006929e824b817c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...824b817c</span></button></rule-id>)</td></tr></tbody></table>Mon, 23 Mar 2026 00:00:00 GMTWAFWAFAccess - Managed OAuth for Cloudflare Accesshttps://developers.cloudflare.com/changelog/post/2026-03-20-managed-oauth/https://developers.cloudflare.com/changelog/post/2026-03-20-managed-oauth/<p>Cloudflare Access supports managed OAuth, which allows non-browser clients — such as CLIs, AI agents, SDKs, and scripts — to authenticate with Access-protected applications using a standard OAuth 2.0 authorization code flow.</p> <p>Previously, non-browser clients that attempted to access a protected application received a <code>302</code> redirect to a login page they could not complete. The established workaround was <code>cloudflared access curl</code>, which required installing additional tooling.</p> <p>With managed OAuth, clients instead receive a <code>401</code> response with a <code>WWW-Authenticate</code> header that points to Access's OAuth discovery endpoints (<a href="https://datatracker.ietf.org/doc/html/rfc8414" target="_blank" rel="noopener">RFC 8414<span class="external-link"> ↗</span></a> and <a href="https://datatracker.ietf.org/doc/html/rfc9728" target="_blank" rel="noopener">RFC 9728<span class="external-link"> ↗</span></a>). The client opens the end user's browser to the Access login page. The end user authenticates with their identity provider, and the client receives an OAuth access token for subsequent requests.</p> <p>Access enforces the same policies as a browser login; the OAuth layer is a new transport mechanism, not a separate authentication path.</p> <p>Managed OAuth can be enabled on any self-hosted Access application or <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portal</a>. It is opt-in for existing applications to avoid interfering with those that run their own OAuth servers and rely on their own <code>WWW-Authenticate</code> headers.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>For MCP server portals, managed OAuth is enabled by default on new portals. It remains opt-in for self-hosted applications.</p></div></div></aside> <p>To enable managed OAuth, go to <strong>Zero Trust</strong> &gt; <strong>Access controls</strong> &gt; <strong>Applications</strong>, edit the application, and turn on <strong>Managed OAuth</strong> under <strong>Advanced settings</strong>.</p> <p>You can also enable it via the API by setting <code>oauth_configuration.enabled</code> to <code>true</code> on the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/applications/methods/update/">Access applications endpoint</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2914,height=1042,format=webp/_astro/managed-oauth.BirLnBpy.png" alt="Managed OAuth settings in the Cloudflare dashboard" loading="lazy" decoding="async" width="2914" height="1042"> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/">Enable managed OAuth</a>.</p>Fri, 20 Mar 2026 00:00:00 GMTAccessAccessAccess - Route MCP server portal traffic through Cloudflare Gatewayhttps://developers.cloudflare.com/changelog/post/2026-03-20-mcp-portal-gateway-routing/https://developers.cloudflare.com/changelog/post/2026-03-20-mcp-portal-gateway-routing/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> can now route traffic through <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a> for richer HTTP request logging and data loss prevention (DLP) scanning.</p> <p>When Gateway routing is turned on, portal traffic appears in your <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/">Gateway HTTP logs</a>. You can create <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway HTTP policies</a> with <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/">DLP profiles</a> to detect and block sensitive data sent to upstream MCP servers.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>DLP <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#ai-prompt">AI prompt profiles</a> do not apply to MCP server portal traffic.</p></div></div></aside> <p>To enable Gateway routing, go to <strong>Access controls</strong> &gt; <strong>AI controls</strong>, edit the portal, and turn on <strong>Route traffic through Cloudflare Gateway</strong> under <strong>Basic information</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1568,height=158,format=webp/_astro/portal-route-through-gateway.0KMUAXBm.png" alt="Route MCP server portal traffic through Cloudflare Gateway" loading="lazy" decoding="async" width="1568" height="158"> <p>For more details, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#route-portal-traffic-through-gateway">Route traffic through Gateway</a>.</p>Fri, 20 Mar 2026 00:00:00 GMTAccessAccessDNS - DNS Analytics for Customer Metadata Boundary set to EU regionhttps://developers.cloudflare.com/changelog/post/2026-03-20-dns-analytics-cmb-eu/https://developers.cloudflare.com/changelog/post/2026-03-20-dns-analytics-cmb-eu/ <p>DNS Analytics is now available for customers with <a href="https://developers.cloudflare.com/data-localization/metadata-boundary/">Customer Metadata Boundary</a> (CMB) set to EU. Query your DNS analytics data while keeping metadata stored in the EU region.</p> <p>This update includes:</p> <ul> <li><strong>DNS Analytics</strong> — Access the same DNS analytics experience for zones in CMB=EU accounts.</li> <li><strong>EU data residency</strong> — Analytics data is stored and queried from the EU region, meeting data localization requirements.</li> <li><strong>DNS Firewall Analytics</strong> — DNS Firewall analytics is now supported for CMB=EU customers.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available to customers with the <a href="https://developers.cloudflare.com/data-localization/">Data Localization Suite</a> who have Customer Metadata Boundary configured for the EU region.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="where-to-find-it">Where to find it</h4><a class="anchor-link" href="#where-to-find-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul><li> <p><strong>Authoritative DNS:</strong> In the Cloudflare dashboard, select your zone and go to the <strong>Analytics</strong> page.</p> <a href="https://dash.cloudflare.com/?to=/:account/:zone/dns/analytics" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Analytics</strong>&nbsp;&#8599;</a></li><li> <p><strong>DNS Firewall:</strong> In the Cloudflare dashboard, go to the <strong>DNS Firewall Analytics</strong> page.</p> <a href="https://dash.cloudflare.com/?to=/:account/dns-firewall/analytics" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Analytics</strong>&nbsp;&#8599;</a></li></ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/dns/additional-options/analytics/">DNS Analytics</a> and <a href="https://developers.cloudflare.com/dns/dns-firewall/analytics/">DNS Firewall Analytics</a>.</p>Fri, 20 Mar 2026 00:00:00 GMTDNSDNSCloudflare Tunnel, Cloudflare Tunnel for SASE - Stream logs from multiple replicas of Cloudflare Tunnel simultaneouslyhttps://developers.cloudflare.com/changelog/post/2026-03-20-tunnel-replica-overview-and-multi-log-streaming/https://developers.cloudflare.com/changelog/post/2026-03-20-tunnel-replica-overview-and-multi-log-streaming/<p>In the Cloudflare One dashboard, the overview page for a specific Cloudflare Tunnel now shows all <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/">replicas</a> of that tunnel and supports streaming logs from multiple replicas at once.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1040,format=webp/_astro/tunnel-multiconn.DEOEaLlu.gif" alt="View replicas and stream logs from multiple connectors" loading="lazy" decoding="async" width="1800" height="1040"> <p>Previously, you could only stream logs from one replica at a time. With this update:</p> <ul> <li><strong>Replicas on the tunnel overview</strong> — All active replicas for the selected tunnel now appear on that tunnel's overview page under <strong>Connectors</strong>. Select any replica to stream its logs.</li> <li><strong>Multi-connector log streaming</strong> — Stream logs from multiple replicas simultaneously, making it easier to correlate events across your infrastructure during debugging or incident response. To try it out, log in to <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare One<span class="external-link"> ↗</span></a> and go to <strong>Networks</strong> &gt; <strong>Connectors</strong> &gt; <strong>Cloudflare Tunnels</strong>. Select <strong>View logs</strong> next to the tunnel you want to monitor.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/monitor-tunnels/logs/">Tunnel log streams</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/deploy-replicas/">Deploy replicas</a>.</p>Fri, 20 Mar 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEWorkers VPC - Observability for Workers VPC Serviceshttps://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/https://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/<p>Each VPC Service now has a <strong>Metrics</strong> tab so you can monitor connection health and debug failures without leaving the dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3336,height=3204,format=webp/_astro/2026-03-20-metrics-dashboard.6kfnbqQd.png" alt="Workers VPC Metrics dashboard showing connections, latency, and errors charts" loading="lazy" decoding="async" width="3336" height="3204"> <ul> <li><strong>Connections</strong> — See successful and failed connections over time, broken down by what is responsible: your origin (Bad Upstream), your configuration (Client), or Cloudflare (Internal).</li> <li><strong>Latency</strong> — Track connection and DNS resolution latency trends.</li> <li><strong>Errors</strong> — Drill into specific error codes grouped by category, with filters to isolate upstream, client, or internal failures.</li> </ul> <p>You can also view and edit your VPC Service configuration, host details, and port assignments from the <strong>Settings</strong> tab.</p> <p>For a full list of error codes and what they mean, refer to <a href="https://developers.cloudflare.com/workers-vpc/reference/troubleshooting/">Troubleshooting</a>.</p>Fri, 20 Mar 2026 00:00:00 GMTWorkers VPCWorkers VPCCloudflare Fundamentals - Service Key authentication deprecatedhttps://developers.cloudflare.com/changelog/post/2026-03-19-service-key-authentication-deprecated/https://developers.cloudflare.com/changelog/post/2026-03-19-service-key-authentication-deprecated/<p>Service Key authentication for the Cloudflare API is deprecated. Service Keys will stop working on September 30, 2026.</p> <p><a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">API Tokens</a> replace Service Keys with fine-grained permissions, expiration, and revocation.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-need-to-do">What you need to do</h4><a class="anchor-link" href="#what-you-need-to-do"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Replace any use of the <code>X-Auth-User-Service-Key</code> header with an <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">API Token</a> scoped to the permissions your integration requires.</p> <p>If you use <code>cloudflared</code>, update to a version from November 2022 or later. These versions already use API Tokens.</p> <p>If you use <a href="https://github.com/cloudflare/origin-ca-issuer" target="_blank" rel="noopener">origin-ca-issuer<span class="external-link"> ↗</span></a>, update to a version that supports API Token authentication.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/fundamentals/api/reference/deprecations/">API deprecations</a>.</p>Thu, 19 Mar 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsHyperdrive - Hyperdrive now supports custom TLS/SSL certificates for MySQLhttps://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/https://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/<p>Hyperdrive now supports custom TLS/SSL certificates for MySQL databases, bringing the same certificate options previously available for PostgreSQL to MySQL connections.</p> <p>You can now configure:</p> <ul> <li><strong>Server certificate verification</strong> with <code>VERIFY_CA</code> or <code>VERIFY_IDENTITY</code> SSL modes to verify that your MySQL database server's certificate is signed by the expected certificate authority (CA).</li> <li><strong>Client certificates</strong> (mTLS) for Hyperdrive to authenticate itself to your MySQL database with credentials beyond username and password.</li> </ul> <p>Create a Hyperdrive configuration with custom certificates for MySQL:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Upload a CA certificate</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> cert</span><span class="nb-shiki-mdbnqw"> upload</span><span class="nb-shiki-mdbnqw"> certificate-authority</span><span class="nb-shiki-dzsirb"> --ca-cert</span><span class="nb-shiki-mdbnqw"> your-ca-cert.pem</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> your-custom-ca-name</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Create a Hyperdrive with VERIFY_IDENTITY mode</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> hyperdrive</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> your-hyperdrive-config</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --connection-string=</span><span class="nb-shiki-mdbnqw">"mysql://user:password@hostname:port/database"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --ca-certificate-id</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">CA_CERT_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --sslmode</span><span class="nb-shiki-mdbnqw"> VERIFY_IDENTITY</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/">SSL/TLS certificates for Hyperdrive</a> and <a href="https://developers.cloudflare.com/hyperdrive/examples/connect-to-mysql/">MySQL TLS/SSL modes</a>.</p>Thu, 19 Mar 2026 00:00:00 GMTHyperdriveHyperdriveCloudflare Tunnel, Workers - Manage Cloudflare Tunnels with Wranglerhttps://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/https://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/<p>You can now manage <a href="https://developers.cloudflare.com/tunnel/">Cloudflare Tunnels</a> directly from <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, the CLI for the Cloudflare Developer Platform. The new <a href="https://developers.cloudflare.com/workers/wrangler/commands/tunnel/"><code>wrangler tunnel</code></a> commands let you create, run, and manage tunnels without leaving your terminal.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1094,format=webp/_astro/wrangler-tunnel.DOqrtGGg.gif" alt="Wrangler tunnel commands demo" loading="lazy" decoding="async" width="1800" height="1094"> <p>Available commands:</p> <ul> <li><code>wrangler tunnel create</code> — Create a new remotely managed tunnel.</li> <li><code>wrangler tunnel list</code> — List all tunnels in your account.</li> <li><code>wrangler tunnel info</code> — Display details about a specific tunnel.</li> <li><code>wrangler tunnel delete</code> — Delete a tunnel.</li> <li><code>wrangler tunnel run</code> — Run a tunnel using the cloudflared daemon.</li> <li><code>wrangler tunnel quick-start</code> — Start a free, temporary tunnel without an account using <a href="https://developers.cloudflare.com/tunnel/setup/#quick-tunnels-development">Quick Tunnels</a>.</li> </ul> <p>Wrangler handles downloading and managing the <a href="https://developers.cloudflare.com/tunnel/downloads/">cloudflared</a> binary automatically. On first use, you will be prompted to download <code>cloudflared</code> to a local cache directory.</p> <p>These commands are currently experimental and may change without notice.</p> <p>To get started, refer to the <a href="https://developers.cloudflare.com/workers/wrangler/commands/tunnel/">Wrangler tunnel commands documentation</a>.</p>Thu, 19 Mar 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelWorkersWorkers AI - Moonshot AI Kimi K2.5 now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/https://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/<p>Workers AI is officially in the big models game. <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/"><code>@cf/moonshotai/kimi-k2.5</code></a> is the first frontier-scale open-source model on our AI inference platform — a large model with a full 256k context window, multi-turn tool calling, vision inputs, and structured outputs. By bringing a frontier-scale model directly onto the Cloudflare Developer Platform, you can now run the entire agent lifecycle on a single, unified platform.</p> <p>The model has proven to be a fast, efficient alternative to larger proprietary models without sacrificing quality. As AI adoption increases, the volume of inference is skyrocketing — now you can access frontier intelligence at a fraction of the cost.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>256,000 token context window</strong> for retaining full conversation history, tool definitions, and entire codebases across long-running agent sessions</li> <li><strong>Multi-turn tool calling</strong> for building agents that invoke tools across multiple conversation turns</li> <li><strong>Vision inputs</strong> for processing images alongside text</li> <li><strong>Structured outputs</strong> with JSON mode and JSON Schema support for reliable downstream parsing</li> <li><strong>Function calling</strong> for integrating external tools and APIs into agent workflows</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="prefix-caching-and-session-affinity">Prefix caching and session affinity</h4><a class="anchor-link" href="#prefix-caching-and-session-affinity"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When an agent sends a new prompt, it resends all previous prompts, tools, and context from the session. The delta between consecutive requests is usually just a few new lines of input. Prefix caching avoids reprocessing the shared context, saving time and compute from the prefill stage. This means faster Time to First Token (TTFT) and higher Tokens Per Second (TPS) throughput.</p> <p>Workers AI has done prefix caching, but we are now surfacing cached tokens as a usage metric and offering a discount on cached tokens compared to input tokens (pricing is listed on the <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/">model page</a>).</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/@cf/moonshotai/kimi-k2.5"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer {api_token}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "x-session-affinity: ses_12345678"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "system",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "You are a helpful assistant."</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "What is prefix caching and why does it matter?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ],</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "max_tokens": 2400,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "stream": true</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>Some clients like <a href="https://opencode.ai" target="_blank" rel="noopener">OpenCode<span class="external-link"> ↗</span></a> implement session affinity automatically. The <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> starter also sets up the wiring for you.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="redesigned-asynchronous-api">Redesigned asynchronous API</h4><a class="anchor-link" href="#redesigned-asynchronous-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For volumes of requests that exceed synchronous rate limits, you can submit batches of inferences to be completed asynchronously. We have revamped the <a href="https://developers.cloudflare.com/workers-ai/features/batch-api/">Asynchronous Batch API</a> with a pull-based system that processes queued requests as soon as capacity is available. With internal testing, async requests usually execute within 5 minutes, but this depends on live traffic.</p> <p>The async API is the best way to avoid capacity errors in durable workflows. It is ideal for use cases that are not real-time, such as code scanning agents or research agents.</p> <p>To use the asynchronous API, pass <code>queueRequest: true</code>:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// 1. Push a batch of requests into the queue</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> res</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "@cf/moonshotai/kimi-k2.5"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> requests: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"Tell me a joke"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"Explain the Pythagoras theorem"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { queueRequest: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// 2. Grab the request ID</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> requestId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> res.request_id;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// 3. Poll for the result</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/moonshotai/kimi-k2.5"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> request_id: requestId,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">if</span><span class="nb-shiki-140thh"> (result.status </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "queued"</span><span class="nb-shiki-1itgoe"> ||</span><span class="nb-shiki-140thh"> result.status </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "running"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Retry by polling again</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">else</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>You can also set up <a href="https://developers.cloudflare.com/workers-ai/platform/event-subscriptions/">event notifications</a> to know when inference is complete instead of polling.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Kimi K2.5 through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/run</code> or <code>/v1/chat/completions</code>, <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a>, or via the <a href="https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/">OpenAI-compatible endpoint</a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/">Kimi K2.5 model page</a>, <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing</a>, and <a href="https://developers.cloudflare.com/workers-ai/features/prompt-caching/">prompt caching</a>.</p>Thu, 19 Mar 2026 00:00:00 GMTWorkers AIWorkers AICloudflare Fundamentals - SCIM provisioning for Authentik is now Generally Availablehttps://developers.cloudflare.com/changelog/post/2026-03-17-scim-authentik-support/https://developers.cloudflare.com/changelog/post/2026-03-17-scim-authentik-support/<p>Cloudflare dashboard SCIM provisioning now supports <a href="https://goauthentik.io/" target="_blank" rel="noopener">Authentik<span class="external-link"> ↗</span></a> as an identity provider, joining Okta and Microsoft Entra ID as explicitly supported providers.</p> <p>Customers can now sync users and group information from Authentik to Cloudflare, apply Permission Policies to those groups, and manage the lifecycle of users &amp; groups directly from your Authentik Identity Provider.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>SCIM provisioning for the Cloudflare dashboard is available to Enterprise customers. You must be a Super Administrator to complete the initial setup.</p></div></div></aside> <p>For more information:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/">SCIM provisioning overview</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/authentik/">Provision with Authentik</a></li> </ul>Wed, 18 Mar 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare Fundamentals - SCIM audit logging Supporthttps://developers.cloudflare.com/changelog/post/2026-03-18-scim-audit-logging/https://developers.cloudflare.com/changelog/post/2026-03-18-scim-audit-logging/<p>Cloudflare dashboard SCIM provisioning operations are now captured in <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs v2</a>, giving you visibility into user and group changes made by your identity provider.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2556,height=1332,format=webp/_astro/2026-03-18-scim-audit-logging.DPKMiE8X.png" alt="SCIM audit logging" loading="lazy" decoding="async" width="2556" height="1332"> <p><strong>Logged actions:</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Action Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>Create SCIM User</td> <td>User provisioned from IdP</td> </tr> <tr> <td>Replace SCIM User</td> <td>User fully replaced (PUT)</td> </tr> <tr> <td>Update SCIM User</td> <td>User attributes modified (PATCH)</td> </tr> <tr> <td>Delete SCIM User</td> <td>Member deprovisioned</td> </tr> <tr> <td>Create SCIM Group</td> <td>Group provisioned from IdP</td> </tr> <tr> <td>Update SCIM Group</td> <td>Group membership or attributes modified</td> </tr> <tr> <td>Delete SCIM Group</td> <td>Group deprovisioned</td> </tr> </tbody> </table></div> <p>For more details, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs v2 documentation</a>.</p>Wed, 18 Mar 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsRules - Worker execution timing field now available in Ruleshttps://developers.cloudflare.com/changelog/post/2026-03-18-worker-timing-field/https://developers.cloudflare.com/changelog/post/2026-03-18-worker-timing-field/<p>The <code>cf.timings.worker_msec</code> field is now available in the Ruleset Engine. This field reports the wall-clock time that a Cloudflare Worker spent handling a request, measured in milliseconds.</p> <p>You can use this field to identify slow Worker executions, detect performance regressions, or build rules that respond differently based on Worker processing time, such as logging requests that exceed a latency threshold.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="field-details">Field details</h4><a class="anchor-link" href="#field-details"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>cf.timings.worker_msec</code></td> <td>Integer</td> <td>The time spent executing a Cloudflare Worker in milliseconds. Returns <code>0</code> if no Worker was invoked.</td> </tr> </tbody> </table></div> <p>Example filter expression:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">cf.timings.worker_msec &gt; 500</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/cf.timings.worker_msec/">Fields reference</a>.</p>Wed, 18 Mar 2026 00:00:00 GMTRulesRulesSecurity Center - Real-time logo match previewhttps://developers.cloudflare.com/changelog/post/2026-03-18-brand-protection-logo-match-preview/https://developers.cloudflare.com/changelog/post/2026-03-18-brand-protection-logo-match-preview/<p>We are introducing <strong>Logo Match Preview</strong>, bringing the same pre-save visibility to visual assets that was previously only available for string-based queries. This update allows you to fine-tune your brand detection strategy before committing to a live monitor.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What’s new:</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Upload your brand logo and immediately see a sample of potential matches from recently detected sites before finalizing the query</li> <li>Adjust your similarity score (from 75% to 100%) and watch the results refresh in real-time to find the balance between broad detection and noise reduction</li> <li>Review the specific logos triggered by your current settings to ensure your query is capturing the right level of brand infringement</li> </ul> <p>If you are ready to test your brand assets, go to the <a href="https://developers.cloudflare.com/security-center/brand-protection/" target="_blank" rel="noopener">Brand Protection dashboard<span class="external-link"> ↗</span></a> to try the new preview tool.</p>Wed, 18 Mar 2026 00:00:00 GMTSecurity CenterSecurity CenterStream - Media Transformations binding for Workershttps://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/https://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/ <p>You can now use a Workers binding to transform videos with Media Transformations. This allows you to resize, crop, extract frames, and extract audio from videos stored anywhere, even in private locations like R2 buckets.</p> <p>The Media Transformations binding is useful when you want to:</p> <ul> <li>Transform videos stored in private or protected sources</li> <li>Optimize videos and store the output directly back to R2 for re-use</li> <li>Extract still frames for classification or description with Workers AI</li> <li>Extract audio tracks for transcription using Workers AI</li> </ul> <p>To get started, add the Media binding to your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "media"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MEDIA"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">media</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"MEDIA"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Then use the binding in your Worker to transform videos:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> video</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">R2_BUCKET</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"input.mp4"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MEDIA</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">input</span><span class="nb-shiki-140thh">(video.body)</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">({ width: </span><span class="nb-shiki-dzsirb">480</span><span class="nb-shiki-140thh">, height: </span><span class="nb-shiki-dzsirb">270</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">output</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"video"</span><span class="nb-shiki-140thh">, duration: </span><span class="nb-shiki-mdbnqw">"5s"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> result.</span><span class="nb-shiki-1t8gfj">response</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> video</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">R2_BUCKET</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"input.mp4"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MEDIA</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">input</span><span class="nb-shiki-140thh">(video.body)</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">({ width: </span><span class="nb-shiki-dzsirb">480</span><span class="nb-shiki-140thh">, height: </span><span class="nb-shiki-dzsirb">270</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">output</span><span class="nb-shiki-140thh">({ mode: </span><span class="nb-shiki-mdbnqw">"video"</span><span class="nb-shiki-140thh">, duration: </span><span class="nb-shiki-mdbnqw">"5s"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> result.</span><span class="nb-shiki-1t8gfj">response</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div></div> <p>Output modes include <code>video</code> for optimized MP4 clips, <code>frame</code> for still images, <code>spritesheet</code> for multiple frames, and <code>audio</code> for M4A extraction.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/stream/transform-videos/bindings/">Media Transformations binding documentation</a>.</p>Wed, 18 Mar 2026 00:00:00 GMTStreamStreamAgents, Workers - @cloudflare/codemode v0.2.1: MCP barrel export, zero-dependency main entry point, and custom sandbox moduleshttps://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v0.2.1/https://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v0.2.1/ <p>The latest releases of <a href="https://www.npmjs.com/package/@cloudflare/codemode" target="_blank" rel="noopener"><code>@cloudflare/codemode</code><span class="external-link"> ↗</span></a> add a new MCP barrel export, remove <code>ai</code> and <code>zod</code> as required peer dependencies from the main entry point, and give you more control over the sandbox.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-cloudflarecodemodemcp-export">New <code>@cloudflare/codemode/mcp</code> export</h4><a class="anchor-link" href="#new-cloudflarecodemodemcp-export"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <code>@cloudflare/codemode/mcp</code> entry point provides two functions that wrap MCP servers with Code Mode:</p> <ul> <li><strong><code>codeMcpServer({ server, executor })</code></strong> — wraps an existing MCP server with a single <code>code</code> tool where each upstream tool becomes a typed <code>codemode.*</code> method.</li> <li><strong><code>openApiMcpServer({ spec, executor, request })</code></strong> — creates <code>search</code> and <code>execute</code> MCP tools from an OpenAPI spec with host-side request proxying and automatic <code>$ref</code> resolution.</li> </ul> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { codeMcpServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/mcp"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DynamicWorkerExecutor } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Wrap an existing MCP server — all its tools become</span></span> <span class="line"><span class="nb-shiki-21nrsd">// typed methods the LLM can call from generated code</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> codeMcpServer</span><span class="nb-shiki-140thh">({ server: upstreamMcp, executor });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { codeMcpServer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/mcp"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DynamicWorkerExecutor } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Wrap an existing MCP server — all its tools become</span></span> <span class="line"><span class="nb-shiki-21nrsd">// typed methods the LLM can call from generated code</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> codeMcpServer</span><span class="nb-shiki-140thh">({ server: upstreamMcp, executor });</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-dependency-main-entry-point">Zero-dependency main entry point</h4><a class="anchor-link" href="#zero-dependency-main-entry-point"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Breaking change in v0.2.0:</strong> <code>generateTypes</code> and the <code>ToolDescriptor</code> / <code>ToolDescriptors</code> types have moved to <code>@cloudflare/codemode/ai</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Before</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateTypes } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// After</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateTypes } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/ai"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Before</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateTypes } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// After</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateTypes } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/ai"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div></div></div></div> <p>The main entry point (<code>@cloudflare/codemode</code>) no longer requires the <code>ai</code> or <code>zod</code> peer dependencies. It now exports:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Export</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>sanitizeToolName</code></td> <td>Sanitize tool names into valid JS identifiers</td> </tr> <tr> <td><code>normalizeCode</code></td> <td>Normalize LLM-generated code into async arrow functions</td> </tr> <tr> <td><code>generateTypesFromJsonSchema</code></td> <td>Generate TypeScript type definitions from plain JSON Schema</td> </tr> <tr> <td><code>jsonSchemaToType</code></td> <td>Convert a single JSON Schema to a TypeScript type string</td> </tr> <tr> <td><code>DynamicWorkerExecutor</code></td> <td>Sandboxed code execution via Dynamic Worker Loader</td> </tr> <tr> <td><code>ToolDispatcher</code></td> <td>RPC target for dispatching tool calls from sandbox to host</td> </tr> </tbody> </table></div> <p>The <code>ai</code> and <code>zod</code> peer dependencies are now optional — only required when importing from <code>@cloudflare/codemode/ai</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="custom-sandbox-modules">Custom sandbox modules</h4><a class="anchor-link" href="#custom-sandbox-modules"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>DynamicWorkerExecutor</code> now accepts an optional <code>modules</code> option to inject custom ES modules into the sandbox:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "utils.js"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">`export function add(a, b) { return a + b; }`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Sandbox code can then: import { add } from "utils.js"</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "utils.js"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">`export function add(a, b) { return a + b; }`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Sandbox code can then: import { add } from "utils.js"</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="internal-normalization-and-sanitization">Internal normalization and sanitization</h4><a class="anchor-link" href="#internal-normalization-and-sanitization"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>DynamicWorkerExecutor</code> now normalizes code and sanitizes tool names internally. You no longer need to call <code>normalizeCode()</code> or <code>sanitizeToolName()</code> before passing code and functions to <code>execute()</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> @cloudflare/codemode@latest</span></span></code></pre></figure> <p>See the <a href="https://developers.cloudflare.com/agents/tools/codemode/">Code Mode documentation</a> for the full API reference.</p>Tue, 17 Mar 2026 00:00:00 GMTAgentsAgentsWorkersAI Gateway - Log AI Gateway request metadata without storing payloadshttps://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/https://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/<p>AI Gateway now supports the <code>cf-aig-collect-log-payload</code> header, which controls whether request and response bodies are stored in logs. By default, this header is set to <code>true</code> and payloads are stored alongside metadata. Set this header to <code>false</code> to skip payload storage while still logging metadata such as token counts, model, provider, status code, cost, and duration.</p> <p>This is useful when you need usage metrics but do not want to persist sensitive prompt or response data.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/</span><span class="nb-shiki-140thh">$GATEWAY_ID</span><span class="nb-shiki-mdbnqw">/openai/chat/completions</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'cf-aig-collect-log-payload: false'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "model": "gpt-4o-mini",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "What is the email address and phone number of user123?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/ai-gateway/observability/logging/#collect-log-payload-cf-aig-collect-log-payload">Logging</a>.</p>Tue, 17 Mar 2026 00:00:00 GMTAI GatewayAI GatewaySecurity Overview - New Security Overview UIhttps://developers.cloudflare.com/changelog/post/2026-03-17-new-security-overview-ui/https://developers.cloudflare.com/changelog/post/2026-03-17-new-security-overview-ui/<p>The Security Overview has been updated to provide Application Security customers with more actionable insights and a clearer view of their security posture.</p> <p>Key improvements include:</p> <ul> <li><strong>Criticality for all Insights</strong>: Every insight now includes a criticality rating, allowing you to prioritize the most impactful security action items first.</li> <li><strong>Detection Tools Section</strong>: A new section displays the security detection tools available to you, indicating which are currently enabled and which can be activated to strengthen your defenses.</li> <li><strong>Industry Peer Comparison</strong> (Enterprise customers): A new module from Security Reports benchmarks your security posture against industry peers, highlighting relative strengths and areas for improvement.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1921,height=958,format=webp/_astro/overview-ui.D7FzaCLm.png" alt="New Security Overview UI" loading="lazy" decoding="async" width="1921" height="958"> <p>For more information, refer to <a href="https://developers.cloudflare.com/security/overview/">Security Overview</a>.</p>Tue, 17 Mar 2026 00:00:00 GMTSecurity OverviewSecurity OverviewVectorize - Return up to 50 query results with values or metadatahttps://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/https://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/<p>You can now set <code>topK</code> up to <code>50</code> when a Vectorize query returns values or full metadata. This raises the previous limit of <code>20</code> for queries that use <code>returnValues: true</code> or <code>returnMetadata: "all"</code>.</p> <p>Use the higher limit when you need more matches in a single query response without dropping values or metadata. Refer to the <a href="https://developers.cloudflare.com/vectorize/reference/client-api/">Vectorize API reference</a> for query options and current <code>topK</code> limits.</p>Mon, 16 Mar 2026 00:00:00 GMTVectorizeVectorizeEmail security - Unlimited result paging in Investigationshttps://developers.cloudflare.com/changelog/post/2026-03-15-infinite-paging-investigations/https://developers.cloudflare.com/changelog/post/2026-03-15-infinite-paging-investigations/<p>Investigations now support unlimited result paging in both the dashboard and the API, removing the previous 1,000-record cap. Security teams can page through complete result sets when searching across large mail volumes, giving SOC analysts and automated workflows deeper visibility for forensics and threat hunting.</p> <p>In the dashboard, infinite paging is now supported in the Investigations view. The 1,000-record ceiling has been removed, so you can navigate through the full result set directly in the UI. The <a href="https://developers.cloudflare.com/api/resources/email_security/subresources/investigate/methods/list">Investigations API</a> now returns up to 10,000 records per page (up from 1,000), with no cap on total result volume across pages.</p> <p>For high-volume use cases, we recommend:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/email-security-logs/">Logpush</a> to a SIEM</strong> for full-fidelity datasets and long-term retention.</li> <li><strong>SOAR playbooks</strong> against the async bulk action API for large-scale remediation. Bulk actions initiated from the dashboard remain capped at 1,000 messages per action.</li> <li><strong>The Investigations API</strong> for report exports larger than 1,000 results, which is the dashboard download cap.</li> </ul> <p>This applies to all Email Security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Sun, 15 Mar 2026 16:00:00 GMTEmail securityEmail securityDurable Objects, Workers - Access Durable Object name via `ctx.id.name`https://developers.cloudflare.com/changelog/post/2026-03-15-durable-object-id-name/https://developers.cloudflare.com/changelog/post/2026-03-15-durable-object-id-name/<p>When your Worker accesses a Durable Object via <code>idFromName()</code> or <code>getByName()</code>, the same name is now available on <code>ctx.id.name</code> inside the object — no need to pass it through method arguments or persist it in storage. This brings the runtime behavior in line with the <a href="https://developers.cloudflare.com/workers/languages/typescript/">Workers runtime types</a>.</p> <p>This is especially useful for <a href="https://developers.cloudflare.com/durable-objects/api/alarms/">alarms</a>, where there is no calling client to pass the name as an argument. When an alarm handler runs, <code>ctx.id.name</code> will hold the same name the object was originally accessed with.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ChatRoom</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> getRoomName</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ctx.id.name returns the name passed to getByName() or idFromName()</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.id.name;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Worker</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">CHAT_ROOM</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"general"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> roomName</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">getRoomName</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Welcome to ${</span><span class="nb-shiki-140thh">roomName</span><span class="nb-shiki-mdbnqw">}!`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p><code>ctx.id.name</code> is <code>undefined</code> in the following cases:</p> <ul> <li>For Durable Objects created with <code>newUniqueId()</code>.</li> <li>When accessed via <code>idFromString()</code>, even if the ID was originally created from a name.</li> <li>For <a href="https://developers.cloudflare.com/durable-objects/api/id/#name">names longer than 1,024 bytes</a>.</li> </ul> <p>This works the same way in local development with <code>wrangler dev</code> as it does in production. Run <code>npm update wrangler</code> to ensure you are on a version with this support.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/durable-objects/api/id/#name">Durable Object ID documentation</a>.</p>Sun, 15 Mar 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersContainers - SSH into running Container instanceshttps://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/ <p>You can now SSH into running Container instances using Wrangler. This is useful for debugging, inspecting running processes, or executing one-off commands inside a Container.</p> <p>To connect, enable <code>wrangler_ssh</code> in your Container configuration and add your <code>ssh-ed25519</code> public key to <code>authorized_keys</code>:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "wrangler_ssh"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "authorized_keys"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;NAME>"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "public_key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&#x3C;YOUR_PUBLIC_KEY_HERE>"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">wrangler_ssh</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">enabled = </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">authorized_keys</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"&#x3C;NAME>"</span></span> <span class="line"><span class="nb-shiki-140thh">public_key = </span><span class="nb-shiki-mdbnqw">"&#x3C;YOUR_PUBLIC_KEY_HERE>"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Then connect with:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> containers</span><span class="nb-shiki-mdbnqw"> ssh</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">INSTANCE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>You can also run a single command without opening an interactive shell:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> containers</span><span class="nb-shiki-mdbnqw"> ssh</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">INSTANCE_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --</span><span class="nb-shiki-mdbnqw"> ls</span><span class="nb-shiki-dzsirb"> -al</span></span></code></pre></figure> <p>Use <code>wrangler containers instances &lt;APPLICATION&gt;</code> to find the instance ID for a running Container.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/containers/ssh/">SSH documentation</a>.</p>Thu, 12 Mar 2026 00:00:00 GMTContainersContainersContainers - List Container instances with `wrangler containers instances`https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/<p>A new <a href="https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances"><code>wrangler containers instances</code></a> command lists all instances for a given Container application. This mirrors the instances view in the Cloudflare dashboard.</p> <p>The command displays each instance's ID, name, state, location, version, and creation time:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> containers</span><span class="nb-shiki-mdbnqw"> instances</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">APPLICATION_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>Use the <code>--json</code> flag for machine-readable output, which is also the default format in non-interactive environments such as CI pipelines.</p> <p>For the full list of options, refer to the <a href="https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances"><code>containers instances</code> command reference</a>.</p>Thu, 12 Mar 2026 00:00:00 GMTContainersContainersCloudflare Fundamentals - Retry-After HTTP header for retryable 1xxx errorshttps://developers.cloudflare.com/changelog/post/2026-03-12-retry-after-header-for-1xxx-errors/https://developers.cloudflare.com/changelog/post/2026-03-12-retry-after-header-for-1xxx-errors/<p>Cloudflare-generated 1xxx error responses now include a standard <code>Retry-After</code> HTTP header when the error is retryable. Agents and HTTP clients can read the recommended wait time from response headers alone — no body parsing required.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Seven retryable error codes now emit <code>Retry-After</code>:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Error code</th> <th>Retry-After (seconds)</th> <th>Error name</th> </tr> </thead> <tbody> <tr> <td>1004</td> <td>120</td> <td>DNS resolution error</td> </tr> <tr> <td>1005</td> <td>120</td> <td>Banned zone</td> </tr> <tr> <td>1015</td> <td>30</td> <td>Rate limited</td> </tr> <tr> <td>1033</td> <td>120</td> <td>Argo Tunnel error</td> </tr> <tr> <td>1038</td> <td>60</td> <td>HTTP headers limit exceeded</td> </tr> <tr> <td>1200</td> <td>60</td> <td>Cache connection limit</td> </tr> <tr> <td>1205</td> <td>5</td> <td>Too many redirects</td> </tr> </tbody> </table></div> <p>The header value matches the existing <code>retry_after</code> body field in JSON and Markdown responses.</p> <p>If a WAF rate limiting rule has already set a dynamic <code>Retry-After</code> value on the response, that value takes precedence.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available for all zones on all plans.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="verify">Verify</h4><a class="anchor-link" href="#verify"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Check for the header on any retryable error:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -s</span><span class="nb-shiki-dzsirb"> --compressed</span><span class="nb-shiki-dzsirb"> -D</span><span class="nb-shiki-mdbnqw"> -</span><span class="nb-shiki-dzsirb"> -o</span><span class="nb-shiki-mdbnqw"> /dev/null</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: application/json"</span><span class="nb-shiki-dzsirb"> -A</span><span class="nb-shiki-mdbnqw"> "TestAgent/1.0"</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept-Encoding: gzip, deflate"</span><span class="nb-shiki-mdbnqw"> "&lt;YOUR_DOMAIN&gt;/cdn-cgi/error/1015"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> grep</span><span class="nb-shiki-dzsirb"> -i</span><span class="nb-shiki-mdbnqw"> retry-after</span></span></code></pre></figure> <p>References:</p> <ul> <li><a href="https://www.rfc-editor.org/rfc/rfc9110#section-10.2.3" target="_blank" rel="noopener">RFC 9110 section 10.2.3 - Retry-After<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/">Cloudflare 1xxx error documentation</a></li> </ul>Thu, 12 Mar 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2026-03-12 - Emergencyhttps://developers.cloudflare.com/changelog/post/2026-03-12-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2026-03-12-emergency-waf-release/ <p>This week's release introduces new detections for vulnerabilities in Ivanti Endpoint Manager Mobile (CVE-2026-1281 and CVE-2026-1340), alongside a new generic detection rule designed to identify and block Cross-Site Scripting (XSS) injection attempts within the <code>Content-Security-Policy</code> (CSP) HTTP request header.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-1281 &amp; CVE-2026-1340: Ivanti Endpoint Manager Mobile processes HTTP requests through Apache RevwriteMap directives that pass user-controlled input to Bash scripts (<code>/mi/bin/map-appstore-url</code> and <code>/mi/bin/map-aft-store-url</code>). Bash scripts do not sanitize user input and are vulnerable to shell arithmetic expansion thereby allowing attackers to achieve unauthenticated remote code execution.</li> <li>Generic XSS in CSP Header: This rule identifies malicious payloads embedded within the request's <code>Content-Security-Policy</code> header. It specifically targets scenarios where web frameworks or applications trust and extract values directly from the CSP header in the incoming request without sufficient validation. Attackers can provide crafted header values to inject scripts or malicious directives that are subsequently processed by the server.</li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of Ivanti EPMM vulnerability allows unauthenticated remote code execution and generic XSS in CSP header allows attackers to inject malicious scripts during page rendering. In environments using server-side caching, this poisoned XSS content can subsequently be cached and automatically served to all visitors.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5ae86a9bda0c41dbb905132f796ea2f6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...796ea2f6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Ivanti EPMM - Code Injection - CVE:CVE-2026-1281 CVE:CVE-2026-1340</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="35978af68e374a059e397bf5ee964a8c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ee964a8c</span></button></rule-id></td><td>N/A</td><td>Anomaly:Header:Content-Security-Policy</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Thu, 12 Mar 2026 00:00:00 GMTWAFWAFCloudflare Fundamentals - JSON responses and RFC 9457 support for Cloudflare 1xxx errorshttps://developers.cloudflare.com/changelog/post/2026-03-11-json-rfc9457-responses-for-1xxx-errors/https://developers.cloudflare.com/changelog/post/2026-03-11-json-rfc9457-responses-for-1xxx-errors/<p>Cloudflare-generated 1xxx errors now return structured JSON when clients send <code>Accept: application/json</code> or <code>Accept: application/problem+json</code>. JSON responses follow <a href="https://www.rfc-editor.org/rfc/rfc9457" target="_blank" rel="noopener">RFC 9457 (Problem Details for HTTP APIs)<span class="external-link"> ↗</span></a>, so any HTTP client that understands Problem Details can parse the base members without Cloudflare-specific code.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-change">Breaking change</h4><a class="anchor-link" href="#breaking-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Markdown frontmatter field <code>http_status</code> has been renamed to <code>status</code>. Agents consuming Markdown frontmatter should update parsers accordingly.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>JSON format.</strong> Clients sending <code>Accept: application/json</code> or <code>Accept: application/problem+json</code> now receive a structured JSON object with the same operational fields as Markdown frontmatter, plus RFC 9457 standard members.</p> <p><strong>RFC 9457 standard members (JSON only):</strong></p> <ul> <li><code>type</code> — URI pointing to Cloudflare documentation for the specific error code</li> <li><code>status</code> — HTTP status code (matching the response status)</li> <li><code>title</code> — short, human-readable summary</li> <li><code>detail</code> — human-readable explanation specific to this occurrence</li> <li><code>instance</code> — Ray ID identifying this specific error occurrence</li> </ul> <p><strong>Field renames:</strong></p> <ul> <li><code>http_status</code> -&gt; <code>status</code> (JSON and Markdown)</li> <li><code>what_happened</code> -&gt; <code>detail</code> (JSON only — Markdown prose sections are unchanged)</li> </ul> <p><strong>Content-Type mirroring.</strong> Clients sending <code>Accept: application/problem+json</code> receive <code>Content-Type: application/problem+json; charset=utf-8</code> back; <code>Accept: application/json</code> receives <code>application/json; charset=utf-8</code>. Same body in both cases.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="negotiation-behavior">Negotiation behavior</h4><a class="anchor-link" href="#negotiation-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Request header sent</th> <th>Response format</th> </tr> </thead> <tbody> <tr> <td><code>Accept: application/json</code></td> <td>JSON (<code>application/json</code> content type)</td> </tr> <tr> <td><code>Accept: application/problem+json</code></td> <td>JSON (<code>application/problem+json</code> content type)</td> </tr> <tr> <td><code>Accept: application/json, text/markdown;q=0.9</code></td> <td>JSON</td> </tr> <tr> <td><code>Accept: text/markdown</code></td> <td>Markdown</td> </tr> <tr> <td><code>Accept: text/markdown, application/json</code></td> <td>Markdown (equal <code>q</code>, first-listed wins)</td> </tr> <tr> <td><code>Accept: */*</code></td> <td>HTML (default)</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available now for Cloudflare-generated 1xxx errors.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -s</span><span class="nb-shiki-dzsirb"> --compressed</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: application/json"</span><span class="nb-shiki-dzsirb"> -A</span><span class="nb-shiki-mdbnqw"> "TestAgent/1.0"</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept-Encoding: gzip, deflate"</span><span class="nb-shiki-mdbnqw"> "&lt;YOUR_DOMAIN&gt;/cdn-cgi/error/1015"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> jq</span><span class="nb-shiki-mdbnqw"> .</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -s</span><span class="nb-shiki-dzsirb"> --compressed</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: application/problem+json"</span><span class="nb-shiki-dzsirb"> -A</span><span class="nb-shiki-mdbnqw"> "TestAgent/1.0"</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept-Encoding: gzip, deflate"</span><span class="nb-shiki-mdbnqw"> "&lt;YOUR_DOMAIN&gt;/cdn-cgi/error/1015"</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-1t8gfj"> jq</span><span class="nb-shiki-mdbnqw"> .</span></span></code></pre></figure> <p>References:</p> <ul> <li><a href="https://www.rfc-editor.org/rfc/rfc9457" target="_blank" rel="noopener">RFC 9457 — Problem Details for HTTP APIs<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/">Cloudflare 1xxx error documentation</a></li> </ul>Wed, 11 Mar 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsLog Explorer - Ingest field selection for Log Explorerhttps://developers.cloudflare.com/changelog/post/2026-03-11-ingest-field-selection/https://developers.cloudflare.com/changelog/post/2026-03-11-ingest-field-selection/<p>Cloudflare Log Explorer now allows you to customize exactly which data fields are ingested and stored when enabling or managing log datasets.</p> <p>Previously, ingesting logs often meant taking an "all or nothing" approach to data fields. With <strong>Ingest Field Selection</strong>, you can now choose from a list of available and recommended fields for each dataset. This allows you to reduce noise, focus on the metrics that matter most to your security and performance analysis, and manage your data footprint more effectively.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Granular control:</strong> Select only the specific fields you need when enabling a new dataset.</li> <li><strong>Dynamic updates:</strong> Update fields for existing, already enabled logstreams at any time.</li> <li><strong>Historical consistency:</strong> Even if you disable a field later, you can still query and receive results for that field for the period it was captured.</li> <li><strong>Data integrity:</strong> Core fields, such as <code>Timestamp</code>, are automatically retained to ensure your logs remain searchable and chronologically accurate.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-configuration">Example configuration</h4><a class="anchor-link" href="#example-configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When configuring a dataset via the dashboard or API, you can define a specific set of fields. The <code>Timestamp</code> field remains mandatory to ensure data indexability.</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "dataset"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"firewall_events"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "fields"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Timestamp"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ClientRequestHost"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "ClientIP"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Action"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "EdgeResponseStatus"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "OriginResponseStatus"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/log-explorer/">Log Explorer documentation</a>.</p>Wed, 11 Mar 2026 00:00:00 GMTLog ExplorerLog ExplorerWorkers AI - NVIDIA Nemotron 3 Super now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/https://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/ <p>We're excited to partner with NVIDIA to bring <a href="https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/"><code>@cf/nvidia/nemotron-3-120b-a12b</code></a> to Workers AI. NVIDIA Nemotron 3 Super is a Mixture-of-Experts (MoE) model with a hybrid Mamba-transformer architecture, 120B total parameters, and 12B active parameters per forward pass.</p> <p>The model is optimized for running many collaborating agents per application. It delivers high accuracy for reasoning, tool calling, and instruction following across complex multi-step tasks.</p> <p><strong>Key capabilities:</strong></p> <ul> <li><strong>Hybrid Mamba-transformer architecture</strong> delivers over 50% higher token generation throughput compared to leading open models, reducing latency for real-world applications</li> <li><strong>Tool calling</strong> support for building AI agents that invoke tools across multiple conversation turns</li> <li><strong>Multi-Token Prediction (MTP)</strong> accelerates long-form text generation by predicting several future tokens simultaneously in a single forward pass</li> <li><strong>32,000 token context window</strong> for retaining conversation history and plan states across multi-step agent workflows</li> </ul> <aside role="note" aria-label="Prompt caching" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Prompt caching</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>For optimal performance with multi-turn conversations, send the <code>x-session-affinity</code> header with a unique session identifier to enable prompt caching. This routes requests to the same model instance, reducing latency and inference costs. For details, refer to <a href="https://developers.cloudflare.com/workers-ai/features/prompt-caching/">Prompt caching</a>.</p></div></div></aside> <p>Use Nemotron 3 Super through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/run</code> or <code>/v1/chat/completions</code>, or the <a href="https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/">OpenAI-compatible endpoint</a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/">Nemotron 3 Super model page</a>.</p>Wed, 11 Mar 2026 00:00:00 GMTWorkers AIWorkers AICloudflare One Client - WARP client for macOS (version 2026.3.566.1)https://developers.cloudflare.com/changelog/post/2026-03-10-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2026-03-10-warp-macos-beta/<p>A new Beta release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and introduces a brand new visual style for the client interface. The new Cloudflare One Client interface changes connectivity management from a toggle to a button and brings useful connectivity settings to the home screen. The redesign also introduces a collapsible navigation bar. When expanded, more client information can be accessed including connectivity, settings, and device profile information. If you have any feedback or questions, visit the <a href="https://community.cloudflare.com/t/introducing-the-new-cloudflare-one-client-interface/901362">Cloudflare Community forum</a> and let us know.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.</li> <li>Fixed an issue in proxy mode where the client could become unresponsive due to upstream connection timeouts.</li> <li>Fixed emergency disconnect state from a previous organization incorrectly persisting after switching organizations.</li> <li>Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.</li> <li>Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.</li> <li>Added monitoring for tunnel statistics collection timeouts.</li> <li>Switched tunnel congestion control algorithm to Cubic for improved reliability across platforms.</li> <li>Fixed initiating managed network detection checks when no network is available, which caused device profile flapping.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>The client may become stuck in a <code>Connecting</code> state. To resolve this issue, reconnect the client by selecting <strong>Disconnect</strong> and then <strong>Connect</strong> in the client user interface. Alternatively, change the client&#39;s operation mode.</li> <li>The client may display an empty white screen upon the device waking from sleep. To resolve this issue, exit and then open the client to re-launch it.</li> <li>Canceling login during a single MDM configuration setup results in an empty page with no way to resume authentication. To work around this issue, exit and relaunch the client.</li> </ul> Tue, 10 Mar 2026 17:10:39 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Windows (version 2026.3.566.1)https://developers.cloudflare.com/changelog/post/2026-03-10-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2026-03-10-warp-windows-beta/<p>A new Beta release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and introduces a brand new visual style for the client interface. The new Cloudflare One Client interface changes connectivity management from a toggle to a button and brings useful connectivity settings to the home screen. The redesign also introduces a collapsible navigation bar. When expanded, more client information can be accessed including connectivity, settings, and device profile information. If you have any feedback or questions, visit the <a href="https://community.cloudflare.com/t/introducing-the-new-cloudflare-one-client-interface/901362">Cloudflare Community forum</a> and let us know.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.</li> <li>Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.</li> <li>Added monitoring for tunnel statistics collection timeouts.</li> <li>Switched tunnel congestion control algorithm to Cubic for improved reliability across platforms.</li> <li>Fixed packet capture failing on tunnel interface when the tunnel interface is renamed by SCCM VPN boundary support.</li> <li>Fixed unnecessary registration deletion caused by RDP connections in multi-user mode.</li> <li>Fixed increased tunnel interface start-up time due to a race between duplicate address detection (DAD) and disabling NetBT.</li> <li>Fixed tunnel failing to connect when the system DNS search list contains unexpected characters.</li> <li>Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.</li> <li>Fixed an issue in proxy mode where the client could become unresponsive due to upstream connection timeouts.</li> <li>Fixed emergency disconnect state from a previous organization incorrectly persisting after switching organizations.</li> <li>Fixed initiating managed network detection checks when no network is available, which caused device profile flapping.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>The client may unexpectedly terminate during captive portal login. To work around this issue, use a web browser to authenticate with the captive portal and then re-launch the client.</li> <li>An error indicating that Microsoft Edge can&#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.</li> <li>The client may become stuck in a <code>Connecting</code> state. To resolve this issue, reconnect the client by selecting <strong>Disconnect</strong> and then <strong>Connect</strong> in the client user interface. Alternatively, change the client&#39;s operation mode.</li> <li>The client may display an empty white screen upon the device waking from sleep. To resolve this issue, exit and then open the client to re-launch it.</li> <li>Canceling login during a single MDM configuration setup results in an empty page with no way to resume authentication. To work around this issue, exit and relaunch the client.</li> <li>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 version KB5062553</a> or higher for resolution.</li> <li>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later. This warning will be omitted from future release notes. This Microsoft Security Intelligence update was released in May 2025.</li> <li>DNS resolution may be broken when the following conditions are all true:<ul> <li>The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while the client is connected. To work around this issue, reconnect the client by selecting <strong>Disconnect</strong> and then <strong>Connect</strong> in the client user interface.</li> </ul> </li> </ul> Tue, 10 Mar 2026 17:10:37 GMTCloudflare One ClientCloudflare One ClientAudit Logs - Audit logs (version 2) - General Availabilityhttps://developers.cloudflare.com/changelog/post/2026-03-10-audit-logs-v2-ga/https://developers.cloudflare.com/changelog/post/2026-03-10-audit-logs-v2-ga/<p>Audit Logs v2 is now generally available to all Cloudflare customers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=319,format=webp/_astro/auditlogsv2.C3pqAR33.gif" alt="Audit Logs v2 GA" loading="lazy" decoding="async" width="800" height="319"> <p>Audit Logs v2 provides a unified and standardized system for tracking and recording all user and system actions across Cloudflare products. Built on Cloudflare's API Shield / OpenAPI gateway, logs are generated automatically without requiring manual instrumentation from individual product teams, ensuring consistency across ~95% of Cloudflare products.</p> <p><strong>What's available at GA:</strong></p> <ul> <li><strong>Standardized logging</strong> — Audit logs follow a consistent format across all Cloudflare products, making it easier to search, filter, and investigate activity.</li> <li><strong>Expanded product coverage</strong> — ~95% of Cloudflare products covered, up from ~75% in v1.</li> <li><strong>Granular filtering</strong> — Filter by actor, action type, action result, resource, raw HTTP method, zone, and more. Over 20 filter parameters available via the API.</li> <li><strong>Enhanced context</strong> — Each log entry includes authentication method, interface (API or dashboard), Cloudflare Ray ID, and actor token details.</li> <li><strong>18-month retention</strong> — Logs are retained for 18 months. Full history is accessible via the API or Logpush.</li> </ul> <p><strong>Access:</strong></p> <ul> <li><strong>Dashboard</strong>: Go to <strong>Manage Account</strong> &gt; <strong>Audit Logs</strong>. Audit Logs v2 is shown by default.</li> <li><strong>API</strong>: <code>GET https://api.cloudflare.com/client/v4/accounts/{account_id}/logs/audit</code></li> <li><strong>Logpush</strong>: Available via the <code>audit_logs_v2</code> account-scoped dataset.</li> </ul> <p><strong>Important notes:</strong></p> <ul> <li>Approximately 30 days of logs from the Beta period (back to ~February 8, 2026) are available at GA. These Beta logs will expire on ~April 9, 2026. Logs generated after GA will be retained for the full 18 months. Older logs remain available in Audit Logs v1.</li> <li>The UI query window is limited to 90 days for performance reasons. Use the API or Logpush for access to the full 18-month history.</li> <li><code>GET</code> requests (view actions) and <code>4xx</code> error responses are not logged at GA. <code>GET</code> logging will be selectively re-enabled for sensitive read operations in a future release.</li> <li>Audit Logs v1 continues to run in parallel. A deprecation timeline will be communicated separately.</li> <li>Before and after values — the ability to see what a value changed from and to — is a highly requested feature and is on our roadmap for a post-GA release. In the meantime, we recommend using Audit Logs v1 for before and after values. Audit Logs v1 will continue to run in parallel until this feature is available in v2.</li> </ul> <p>For more details, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs v2 documentation</a>.</p>Tue, 10 Mar 2026 00:00:00 GMTAudit LogsAudit LogsBrowser Run - Crawl entire websites with a single API call using Browser Renderinghttps://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/https://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/<p><em>Edit: this post has been edited to clarify crawling behavior with respect to site guidance.</em></p> <p>You can now crawl an entire website with a single API call using <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a>'s new <a href="https://developers.cloudflare.com/browser-run/quick-actions/crawl-endpoint/"><code>/crawl</code> endpoint</a>, available in open beta. Submit a starting URL, and pages are automatically discovered, rendered in a headless browser, and returned in multiple formats, including HTML, Markdown, and structured JSON. The endpoint is a <a href="https://developers.cloudflare.com/bots/concepts/bot/verified-bots/">verified bot (intermediary agent)</a> that respects robots.txt and <a href="https://www.cloudflare.com/ai-crawl-control/" target="_blank" rel="noopener">AI Crawl Control<span class="external-link"> ↗</span></a> by default, making it easy for developers to comply with website rules, and making it less likely for crawlers to ignore web-owner guidance. This is great for training models, building RAG pipelines, and researching or monitoring content across a site.</p> <p>Crawl jobs run asynchronously. You submit a URL, receive a job ID, and check back for results as pages are processed.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Initiate a crawl</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://blog.cloudflare.com/"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Check results</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> GET</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/{job_id}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span></span></code></pre></figure> <p>Key features:</p> <ul> <li><strong>Multiple output formats</strong> - Return crawled content as HTML, Markdown, and structured JSON (powered by <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>)</li> <li><strong>Crawl scope controls</strong> - Configure crawl depth, page limits, and wildcard patterns to include or exclude specific URL paths</li> <li><strong>Automatic page discovery</strong> - Discovers URLs from sitemaps, page links, or both</li> <li><strong>Incremental crawling</strong> - Use <code>modifiedSince</code> and <code>maxAge</code> to skip pages that haven't changed or were recently fetched, saving time and cost on repeated crawls</li> <li><strong>Static mode</strong> - Set <code>render: false</code> to fetch static HTML without spinning up a browser, for faster crawling of static sites</li> <li><strong>Well-behaved bot</strong> - Honors <code>robots.txt</code> directives, including <code>crawl-delay</code></li> </ul> <p>Available on both the Workers Free and Paid plans.</p> <p><strong>Note</strong>: the /crawl endpoint cannot bypass Cloudflare bot detection or captchas, and self-identifies as a bot.</p> <p>To get started, refer to the <a href="https://developers.cloudflare.com/browser-run/quick-actions/crawl-endpoint/">crawl endpoint documentation</a>. If you are setting up your own site to be crawled, review the <a href="https://developers.cloudflare.com/browser-run/reference/robots-txt/">robots.txt and sitemaps best practices</a>.</p>Tue, 10 Mar 2026 00:00:00 GMTBrowser RunBrowser RunAPI Shield - New Vulnerability Scanner for API Shieldhttps://developers.cloudflare.com/changelog/post/2026-03-09-vulnerability-scanner/https://developers.cloudflare.com/changelog/post/2026-03-09-vulnerability-scanner/<p>Introducing Cloudflare's Web and API Vulnerability Scanner (Open Beta)</p> <p>Cloudflare is launching the <a href="https://blog.cloudflare.com/vulnerability-scanner" target="_blank" rel="noopener">Open Beta of the <strong>Web and API Vulnerability Scanner</strong><span class="external-link"> ↗</span></a> for all <a href="https://developers.cloudflare.com/api-shield/">API Shield</a> customers. This new, stateful Dynamic Application Security Testing (DAST) platform helps teams proactively find logic flaws in their APIs.</p> <p>The initial release focuses on detecting Broken Object Level Authorization (BOLA) vulnerabilities by building API call graphs to simulate attacker and owner contexts, then testing these contexts by sending real HTTP requests to your APIs.</p> <p>The scanner is now available via the Cloudflare API. To scan, set up your target environment, owner and attacker credentials, and upload your OpenAPI file with response schemas. The scanner will be available in the Cloudflare dashboard in a future release.</p> <p><strong>Access</strong>: This feature is only available to API Shield subscribers via the Cloudflare API. We hope you will use the API for programmatic integration into your CI/CD pipelines and security dashboards.</p> <p><strong>Documentation</strong>: Refer to the <a href="https://developers.cloudflare.com/api-shield/security/vulnerability-scanner/">developer documentation</a> to start scanning your endpoints today.</p>Mon, 09 Mar 2026 00:00:00 GMTAPI ShieldAPI ShieldLogs - New MCP Portal Logs dataset and new fields across multiple Logpush datasets in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2026-03-09-log-fields-updated/https://developers.cloudflare.com/changelog/post/2026-03-09-log-fields-updated/<p>Cloudflare has added new fields across multiple <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-dataset">New dataset</h4><a class="anchor-link" href="#new-dataset"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>MCP Portal Logs</strong>: A new dataset with fields including <code>ClientCountry</code>, <code>ClientIP</code>, <code>ColoCode</code>, <code>Datetime</code>, <code>Error</code>, <code>Method</code>, <code>PortalAUD</code>, <code>PortalID</code>, <code>PromptGetName</code>, <code>ResourceReadURI</code>, <code>ServerAUD</code>, <code>ServerID</code>, <code>ServerResponseDurationMs</code>, <code>ServerURL</code>, <code>SessionID</code>, <code>Success</code>, <code>ToolCallName</code>, <code>UserEmail</code>, and <code>UserID</code>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields-in-existing-datasets">New fields in existing datasets</h4><a class="anchor-link" href="#new-fields-in-existing-datasets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>DEX Application Tests</strong>: <code>HTTPRedirectEndMs</code>, <code>HTTPRedirectStartMs</code>, <code>HTTPResponseBody</code>, and <code>HTTPResponseHeaders</code>.</li> <li><strong>DEX Device State Events</strong>: <code>ExperimentalExtra</code>.</li> <li><strong>Firewall Events</strong>: <code>FraudUserID</code>.</li> <li><strong>Gateway HTTP</strong>: <code>AppControlInfo</code> and <code>ApplicationStatuses</code>.</li> <li><strong>Gateway DNS</strong>: <code>InternalDNSDurationMs</code>.</li> <li><strong>HTTP Requests</strong>: <code>FraudEmailRisk</code>, <code>FraudUserID</code>, and <code>PayPerCrawlStatus</code>.</li> <li><strong>Network Analytics Logs</strong>: <code>DNSQueryName</code>, <code>DNSQueryType</code>, and <code>PFPCustomTag</code>.</li> <li><strong>WARP Toggle Changes</strong>: <code>UserEmail</code>.</li> <li><strong>WARP Config Changes</strong>: <code>UserEmail</code>.</li> <li><strong>Zero Trust Network Session Logs</strong>: <code>SNI</code>.</li> </ul> <p>For the complete field definitions for each dataset, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/">Logpush datasets</a>.</p>Mon, 09 Mar 2026 00:00:00 GMTLogsLogsWorkflows, Workers - Workflow steps now expose retry attempt number via step contexthttps://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/<p>Cloudflare Workflows allows you to configure specific retry logic for each step in your workflow execution. Now, you can access <strong>which</strong> retry attempt is currently executing for calls to <code>step.do()</code>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-step"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ctx.attempt is 1 on first try, 2 on first retry, etc.</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Attempt ${</span><span class="nb-shiki-140thh">ctx</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">attempt</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>You can use the step context for improved logging &amp; observability, progressive backoff, or conditional logic in your workflow definition.</p> <p>Note that the current attempt number is 1-indexed. For more information on retry behavior, refer to <a href="https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/">Sleeping and Retrying</a>.</p>Fri, 06 Mar 2026 12:00:00 GMTWorkflowsWorkflowsWorkersRadar - Region Filtering, AS Traffic Volume, and Navigation Improvements on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-03-06-radar-region-filtering-traffic-volume-navigation/https://developers.cloudflare.com/changelog/post/2026-03-06-radar-region-filtering-traffic-volume-navigation/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> ships several new features that improve the flexibility and usability of the platform, as well as visibility into what is happening on the Internet.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="region-filtering">Region filtering</h4><a class="anchor-link" href="#region-filtering"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>All location-aware pages now support filtering by region, including continents, geographic subregions (<a href="https://radar.cloudflare.com/middle-east" target="_blank" rel="noopener">Middle East<span class="external-link"> ↗</span></a>, <a href="https://radar.cloudflare.com/eastern-asia" target="_blank" rel="noopener">Eastern Asia<span class="external-link"> ↗</span></a>, etc.), political regions (<a href="https://radar.cloudflare.com/european-union" target="_blank" rel="noopener">EU<span class="external-link"> ↗</span></a>, <a href="https://radar.cloudflare.com/african-union" target="_blank" rel="noopener">African Union<span class="external-link"> ↗</span></a>), and US Census regions/divisions (for example, <a href="https://radar.cloudflare.com/traffic/us-new-england" target="_blank" rel="noopener">New England<span class="external-link"> ↗</span></a>, <a href="https://radar.cloudflare.com/traffic/us-northeast" target="_blank" rel="noopener">US Northeast<span class="external-link"> ↗</span></a>).</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1108,format=webp/_astro/region-filtering-middle-east.D__dYNBw.png" alt="Screenshot of region filtering on Radar - Middle east" loading="lazy" decoding="async" width="1600" height="1108"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="traffic-volume-by-top-autonomous-systems-and-locations">Traffic volume by top autonomous systems and locations</h4><a class="anchor-link" href="#traffic-volume-by-top-autonomous-systems-and-locations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new traffic volume view shows the top autonomous systems and countries/territories for a given location. This is useful for quickly determining which network providers in a location may be experiencing connectivity issues, or how traffic is distributed across a region.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=928,format=webp/_astro/traffic-volume-top-as-us.DhnbB8gy.png" alt="Screenshot of traffic volume by top autonomous systems in US" loading="lazy" decoding="async" width="1600" height="928"> <p>The new AS and location dimensions have also been added to the <a href="https://radar.cloudflare.com/explorer" target="_blank" rel="noopener">Data Explorer<span class="external-link"> ↗</span></a> for the HTTP, DNS, and NetFlows datasets. Combined with other available filters, this provides a powerful tool for generating unique insights.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1486,format=webp/_astro/data-explorer-top-as-pt.DAWOCd_b.png" alt="Screenshot of AS and location dimensions in Data Explorer" loading="lazy" decoding="async" width="1600" height="1486"> <p>Finally, breadcrumb navigation is now available on most pages, allowing easier navigation between parent and related pages.</p> <p>Check out these features on <a href="https://radar.cloudflare.com" target="_blank" rel="noopener">Cloudflare Radar<span class="external-link"> ↗</span></a>.</p>Fri, 06 Mar 2026 00:00:00 GMTRadarRadarWorkers AI, Realtime - Real-time transcription in RealtimeKit now supports 10 languages with regional variantshttps://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/https://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/<p><a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/">Real-time transcription</a> in RealtimeKit now supports 10 languages with regional variants, powered by <a href="https://developers.cloudflare.com/workers-ai/models/nova-3/">Deepgram Nova-3</a> running on <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>.</p> <p>During a meeting, participant audio is routed through <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> to Nova-3 on Workers AI — so transcription runs on Cloudflare's network end-to-end, reducing latency compared to routing through external speech-to-text services.</p> <p>Set the language when <a href="https://developers.cloudflare.com/realtime/realtimekit/concepts/meeting/">creating a meeting</a> via <code>ai_config.transcription.language</code>:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ai_config"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "transcription"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "language"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"fr"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Supported languages include English, Spanish, French, German, Hindi, Russian, Portuguese, Japanese, Italian, and Dutch — with regional variants like <code>en-AU</code>, <code>en-GB</code>, <code>en-IN</code>, <code>en-NZ</code>, <code>es-419</code>, <code>fr-CA</code>, <code>de-CH</code>, <code>pt-BR</code>, and <code>pt-PT</code>. Use <code>multi</code> for automatic multilingual detection.</p> <p>If you are building voice agents or real-time translation workflows, your agent can now transcribe in the caller's language natively — no extra services or routing logic needed.</p> <ul> <li><a href="https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/">Transcription docs</a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/nova-3/">Nova-3 model page</a></li> <li><a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a></li> <li><a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a></li> </ul>Fri, 06 Mar 2026 00:00:00 GMTWorkers AIWorkers AIRealtimeSecurity Center - Dismiss and filter matches in Brand Protectionhttps://developers.cloudflare.com/changelog/post/2026-03-06-brand-protection-dismiss-match/https://developers.cloudflare.com/changelog/post/2026-03-06-brand-protection-dismiss-match/<p>We have introduced new triage controls to help you manage your Brand Protection results more efficiently. You can now clear out the noise by dismissing matches while maintaining full visibility into your historical decisions.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Dismiss matches</strong>: Users can now mark specific results as dismissed if they are determined to be benign or false positives, removing them from the primary triage view.</li> <li><strong>Show/Hide toggle</strong>: A new visibility control allows you to instantly switch between viewing only active matches and including previously dismissed ones.</li> <li><strong>Persistent review states</strong>: Dismissed status is saved across sessions, ensuring that your workspace remains organized and focused on new or high-priority threats.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits-of-the-dismiss-match-functionality">Key benefits of the dismiss match functionality:</h4><a class="anchor-link" href="#key-benefits-of-the-dismiss-match-functionality"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Reduce alert fatigue by hiding known-safe results, allowing your team to focus exclusively on unreviewed or high-risk infringements.</li> <li>Auditability and recovery through the visibility toggle, ensuring that no match is ever truly "lost" and can be re-evaluated if a site's content changes.</li> <li>Improved collaboration as your team members can see which matches have already been vetted and dismissed by others.</li> </ul> <p>Ready to clean up your match queue? Learn more in our <a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection documentation</a>.</p>Fri, 06 Mar 2026 00:00:00 GMTSecurity CenterSecurity CenterBrowser Run - Browser Rendering: 3x higher REST API request ratehttps://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/<p><a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> REST API rate limits for Workers Paid plans have been increased from 3 requests per second (180/min) to <strong>10 requests per second (600/min)</strong>. No action is needed to benefit from the higher limit.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=916,height=85,format=webp/_astro/rest-api-limit-increase.DJHY7xYF.png" alt="Browser Rendering REST API rate limit increased from 3 to 10 requests per second" loading="lazy" decoding="async" width="916" height="85"> <p>The <a href="https://developers.cloudflare.com/browser-run/quick-actions/">REST API</a> lets you perform common browser tasks with a single API call, and you can now do it at a higher rate.</p> <ul> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/">/content - Fetch HTML</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/">/screenshot - Capture screenshot</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/">/pdf - Render PDF</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/">/markdown - Extract Markdown from a webpage</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/snapshot/">/snapshot - Take a webpage snapshot</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/">/scrape - Scrape HTML elements</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/">/json - Capture structured data using AI</a></li> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/">/links - Retrieve links from a webpage</a></li> </ul> <p>If you use the <a href="https://developers.cloudflare.com/browser-run/#integration-methods">Browser Sessions</a> method, increases to concurrent browser and new browser limits are coming soon. Stay tuned.</p> <p>For full details, refer to the <a href="https://developers.cloudflare.com/browser-run/limits/">Browser Rendering limits page</a>.</p>Wed, 04 Mar 2026 00:00:00 GMTBrowser RunBrowser RunCloudflare One, Access - User risk score selector in Access policieshttps://developers.cloudflare.com/changelog/post/2026-03-04-user-risk-score-access-policies/https://developers.cloudflare.com/changelog/post/2026-03-04-user-risk-score-access-policies/<p>You can now use <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/">user risk scores</a> in your <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Access policies</a>. The new <strong>User Risk Score</strong> selector allows you to create Access policies that respond to user behavior patterns detected by Cloudflare's risk scoring system, including impossible travel, high DLP policy matches, and more.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/#use-risk-scores-in-access-policies">Use risk scores in Access policies</a>.</p>Wed, 04 Mar 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessGateway - Gateway Authorization Proxy and hosted PAC files (open beta)https://developers.cloudflare.com/changelog/post/2026-03-04-gateway-authorization-proxy-open-beta/https://developers.cloudflare.com/changelog/post/2026-03-04-gateway-authorization-proxy-open-beta/<p>The <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint">Gateway Authorization Proxy</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file">PAC file hosting</a> are now in open beta for all plan types.</p> <p>Previously, <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint">proxy endpoints</a> relied on static source IP addresses to authorize traffic, providing no user-level identity in logs or policies. The new authorization proxy replaces IP-based authorization with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a> authentication, verifying who a user is before applying Gateway filtering without installing the WARP client.</p> <p>This is ideal for environments where you cannot deploy a device client, such as virtual desktops (VDI), mergers and acquisitions, or compliance-restricted endpoints.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Identity-aware proxy traffic</strong> — Users authenticate through your identity provider (Okta, Microsoft Entra ID, Google Workspace, and others) via Cloudflare Access. Logs now show exactly which user accessed which site, and you can write <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/">identity-based policies</a> like "only the Finance team can access this accounting tool."</li> <li><strong>Multiple identity providers</strong> — Display one or multiple login methods simultaneously, giving flexibility for organizations managing users across different identity systems.</li> <li><strong>Cloudflare-hosted PAC files</strong> — Create and host <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file">PAC files</a> directly in Cloudflare One with pre-configured templates for Okta and Azure, hosted at <code>https://pac.cloudflare-gateway.com/&lt;account-id&gt;/&lt;slug&gt;</code> on Cloudflare's global network.</li> <li><strong>Simplified billing</strong> — Each user occupies a seat, exactly like they do with the Cloudflare One Client. No new metrics to track.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>In <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare One<span class="external-link"> ↗</span></a>, go to <strong>Networks</strong> &gt; <strong>Resolvers &amp; Proxies</strong> &gt; <strong>Proxy endpoints</strong>.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint">Create an authorization proxy endpoint</a> and configure Access policies.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file">Create a hosted PAC file</a> or write your own.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#3b-configure-browser-to-use-pac-file">Configure browsers</a> to use the PAC file URL.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/user-side-certificates/">Install the Cloudflare certificate</a> for HTTPS inspection.</li> </ol> <p>For more details, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/">proxy endpoints documentation</a> and the <a href="https://blog.cloudflare.com/gateway-authorization-proxy-identity-aware-policies/" target="_blank" rel="noopener">announcement blog post<span class="external-link"> ↗</span></a>.</p>Wed, 04 Mar 2026 00:00:00 GMTGatewayGatewayWorkers AI - New conversion options for Markdown Conversionhttps://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/https://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/ <p>You can now customize how the <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown Conversion</a> service processes different file types by passing a <code>conversionOptions</code> object.</p> <p>Available options:</p> <ul> <li><strong>Images</strong>: Set the language for AI-generated image descriptions</li> <li><strong>HTML</strong>: Use CSS selectors to extract specific content, or provide a hostname to resolve relative links</li> <li><strong>PDF</strong>: Exclude metadata from the output</li> </ul> <p>Use the <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/usage/binding/"><code>env.AI</code></a> binding:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { name: </span><span class="nb-shiki-mdbnqw">"page.html"</span><span class="nb-shiki-140thh">, blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([html]) },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> conversionOptions: {</span></span> <span class="line"><span class="nb-shiki-140thh"> html: { cssSelector: </span><span class="nb-shiki-mdbnqw">"article.content"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> image: { descriptionLanguage: </span><span class="nb-shiki-mdbnqw">"es"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { name: </span><span class="nb-shiki-mdbnqw">"page.html"</span><span class="nb-shiki-140thh">, blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([html]) },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> conversionOptions: {</span></span> <span class="line"><span class="nb-shiki-140thh"> html: { cssSelector: </span><span class="nb-shiki-mdbnqw">"article.content"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> image: { descriptionLanguage: </span><span class="nb-shiki-mdbnqw">"es"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Or call the REST API:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {API_TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'files=@index.html'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'conversionOptions={"html": {"cssSelector": "article.content"}}'</span></span></code></pre></figure> <p>For more details, refer to <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/conversion-options/">Conversion Options</a>.</p>Wed, 04 Mar 2026 00:00:00 GMTWorkers AIWorkers AIWorkflows, Workers - Workflows step limit increased to 25,000 steps per instancehttps://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/https://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/<p>Each Workflow on Workers Paid now supports 10,000 steps by default, configurable up to 25,000 steps in your <code>wrangler.jsonc</code> file:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "workflows"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-workflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_WORKFLOW"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "class_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MyWorkflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "limits"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "steps"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">25000</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Previously, each instance was limited to 1,024 steps. Now, Workflows can support more complex, long-running executions without the additional complexity of recursive or child workflow calls.</p> <p>Note that the maximum persisted state limit per Workflow instance remains <strong>100 MB</strong> for Workers Free and <strong>1 GB</strong> for Workers Paid. Refer to <a href="https://developers.cloudflare.com/workflows/reference/limits/">Workflows limits</a> for more information.</p>Tue, 03 Mar 2026 12:00:00 GMTWorkflowsWorkflowsWorkersAgents - Real-time file watching in Sandboxeshttps://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/ <p><a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> now support real-time filesystem watching via <code>sandbox.watch()</code>. The method returns a <a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events" target="_blank" rel="noopener">Server-Sent Events<span class="external-link"> ↗</span></a> stream backed by native inotify, so your Worker receives <code>create</code>, <code>modify</code>, <code>delete</code>, and <code>move</code> events as they happen inside the container.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sandboxwatchpath-options"><code>sandbox.watch(path, options)</code></h4><a class="anchor-link" href="#sandboxwatchpath-options"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Pass a directory path and optional filters. The returned stream is a standard <code>ReadableStream</code> you can proxy directly to a browser client or consume server-side.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Stream events to a browser client</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">watch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/workspace/src"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> recursive: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> include: [</span><span class="nb-shiki-mdbnqw">"*.ts"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"*.js"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(stream, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/event-stream"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Stream events to a browser client</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">watch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/workspace/src"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> recursive: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> include: [</span><span class="nb-shiki-mdbnqw">"*.ts"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"*.js"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(stream, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/event-stream"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="server-side-consumption-with-parsessestream">Server-side consumption with <code>parseSSEStream</code></h4><a class="anchor-link" href="#server-side-consumption-with-parsessestream"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use <code>parseSSEStream</code> to iterate over events inside a Worker without forwarding them to a client.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { parseSSEStream } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">watch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/workspace/src"</span><span class="nb-shiki-140thh">, { recursive: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-1t8gfj"> parseSSEStream</span><span class="nb-shiki-140thh">(stream)) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(event.type, event.path);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { parseSSEStream } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { FileWatchSSEEvent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">watch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/workspace/src"</span><span class="nb-shiki-140thh">, { recursive: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-1t8gfj"> parseSSEStream</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">FileWatchSSEEvent</span><span class="nb-shiki-140thh">&gt;(stream)) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(event.type, event.path);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Each event includes a <code>type</code> field (<code>create</code>, <code>modify</code>, <code>delete</code>, or <code>move</code>) and the affected <code>path</code>. Move events also include a <code>from</code> field with the original path.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="options">Options</h4><a class="anchor-link" href="#options"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Option</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>recursive</code></td> <td><code>boolean</code></td> <td>Watch subdirectories. Defaults to <code>false</code>.</td> </tr> <tr> <td><code>include</code></td> <td><code>string[]</code></td> <td>Glob patterns to filter events. Omit to receive all events.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> @cloudflare/sandbox@latest</span></span></code></pre></figure> <p>For full API details, refer to the <a href="https://developers.cloudflare.com/sandbox/api/file-watching/">Sandbox file watching reference</a>.</p>Tue, 03 Mar 2026 00:00:00 GMTAgentsAgentsRadar - Network Quality Test on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-03-03-radar-network-quality-test/https://developers.cloudflare.com/changelog/post/2026-03-03-radar-network-quality-test/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes a <a href="https://radar.cloudflare.com/speedtest" target="_blank" rel="noopener">Network Quality Test<span class="external-link"> ↗</span></a> page. The tool measures Internet connection quality and performance, showing connection details such as IP address, server location, network (ASN), and IP version. For more detailed speed test results, the page links to <a href="https://speed.cloudflare.com/" target="_blank" rel="noopener">speed.cloudflare.com<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2294,height=1526,format=webp/_astro/network-quality-test.BwQ-CoTH.png" alt="Screenshot of the Network Quality Test page on Radar" loading="lazy" decoding="async" width="2294" height="1526">Tue, 03 Mar 2026 00:00:00 GMTRadarRadarAgents, Workers - Agents SDK v0.7.0: Observability rewrite, keepAlive, and waitForMcpConnectionshttps://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v0.7.0/https://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v0.7.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> rewrites observability from scratch with <code>diagnostics_channel</code>, adds <code>keepAlive()</code> to prevent Durable Object eviction during long-running work, and introduces <code>waitForMcpConnections</code> so MCP tools are always available when <code>onChatMessage</code> runs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="observability-rewrite">Observability rewrite</h4><a class="anchor-link" href="#observability-rewrite"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The previous observability system used <code>console.log()</code> with a custom <code>Observability.emit()</code> interface. v0.7.0 replaces it with structured events published to <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/diagnostics-channel/">diagnostics channels</a> — silent by default, zero overhead when nobody is listening.</p> <p>Every event has a <code>type</code>, <code>payload</code>, and <code>timestamp</code>. Events are routed to seven named channels:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Channel</th> <th>Event types</th> </tr> </thead> <tbody> <tr> <td><code>agents:state</code></td> <td><code>state:update</code></td> </tr> <tr> <td><code>agents:rpc</code></td> <td><code>rpc</code>, <code>rpc:error</code></td> </tr> <tr> <td><code>agents:message</code></td> <td><code>message:request</code>, <code>message:response</code>, <code>message:clear</code>, <code>message:cancel</code>, <code>message:error</code>, <code>tool:result</code>, <code>tool:approval</code></td> </tr> <tr> <td><code>agents:schedule</code></td> <td><code>schedule:create</code>, <code>schedule:execute</code>, <code>schedule:cancel</code>, <code>schedule:retry</code>, <code>schedule:error</code>, <code>queue:retry</code>, <code>queue:error</code></td> </tr> <tr> <td><code>agents:lifecycle</code></td> <td><code>connect</code>, <code>destroy</code></td> </tr> <tr> <td><code>agents:workflow</code></td> <td><code>workflow:start</code>, <code>workflow:event</code>, <code>workflow:approved</code>, <code>workflow:rejected</code>, <code>workflow:terminated</code>, <code>workflow:paused</code>, <code>workflow:resumed</code>, <code>workflow:restarted</code></td> </tr> <tr> <td><code>agents:mcp</code></td> <td><code>mcp:client:preconnect</code>, <code>mcp:client:connect</code>, <code>mcp:client:authorize</code>, <code>mcp:client:discover</code></td> </tr> </tbody> </table></div> <p>Use the typed <code>subscribe()</code> helper from <code>agents/observability</code> for type-safe access:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { subscribe } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/observability"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> unsub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> subscribe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"rpc"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (event.type </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "rpc"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`RPC call: ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (event.type </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "rpc:error"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `RPC failed: ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">} — ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Clean up when done</span></span> <span class="line"><span class="nb-shiki-1t8gfj">unsub</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { subscribe } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/observability"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> unsub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> subscribe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"rpc"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (event.type </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "rpc"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`RPC call: ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (event.type </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "rpc:error"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `RPC failed: ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">} — ${</span><span class="nb-shiki-140thh">event</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Clean up when done</span></span> <span class="line"><span class="nb-shiki-1t8gfj">unsub</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>In production, all diagnostics channel messages are automatically forwarded to <a href="https://developers.cloudflare.com/workers/observability/logs/tail-workers/">Tail Workers</a> — no subscription code needed in the agent itself:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> tail</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">events</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> events) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> msg</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> event.diagnosticsChannelEvents) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // msg.channel is "agents:rpc", "agents:workflow", etc.</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(msg.timestamp, msg.channel, msg.message);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> tail</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">events</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> events) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> msg</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> event.diagnosticsChannelEvents) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // msg.channel is "agents:rpc", "agents:workflow", etc.</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(msg.timestamp, msg.channel, msg.message);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div></div> <p>The custom <code>Observability</code> override interface is still supported for users who need to filter or forward events to external services.</p> <p>For the full event reference, refer to the <a href="https://developers.cloudflare.com/agents/runtime/operations/observability/diagnostics-channels/">Diagnostics channels documentation</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="keepalive-and-keepalivewhile"><code>keepAlive()</code> and <code>keepAliveWhile()</code></h4><a class="anchor-link" href="#keepalive-and-keepalivewhile"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Durable Objects are evicted after a period of inactivity (typically 70-140 seconds with no incoming requests, WebSocket messages, or alarms). During long-running operations — streaming LLM responses, waiting on external APIs, running multi-step computations — the agent can be evicted mid-flight.</p> <p><code>keepAlive()</code> prevents this by creating a 30-second heartbeat schedule. The alarm firing resets the inactivity timer. Returns a disposer function that cancels the heartbeat when called.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> dispose</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">keepAlive</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> longRunningComputation</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> sendResults</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> dispose</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> dispose</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">keepAlive</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> longRunningComputation</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> sendResults</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> dispose</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p><code>keepAliveWhile()</code> wraps an async function with automatic cleanup — the heartbeat starts before the function runs and stops when it completes:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">keepAliveWhile</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> longRunningComputation</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> data;</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">keepAliveWhile</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> longRunningComputation</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> data;</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>Key details:</p> <ul> <li><strong>Multiple concurrent callers</strong> — Each <code>keepAlive()</code> call returns an independent disposer. Disposing one does not affect others.</li> <li><strong>AIChatAgent built-in</strong> — <code>AIChatAgent</code> automatically calls <code>keepAlive()</code> during streaming responses. You do not need to add it yourself.</li> <li><strong>Uses the scheduling system</strong> — The heartbeat does not conflict with your own schedules. It shows up in <code>getSchedules()</code> if you need to inspect it.</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p><code>keepAlive()</code> is marked <code>@experimental</code> and may change between releases.</p></div></div></aside> <p>For the full API reference and when-to-use guidance, refer to <a href="https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/#keeping-the-agent-alive">Schedule tasks — Keeping the agent alive</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="waitformcpconnections"><code>waitForMcpConnections</code></h4><a class="anchor-link" href="#waitformcpconnections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>AIChatAgent</code> now waits for MCP server connections to settle before calling <code>onChatMessage</code>. This ensures <code>this.mcp.getAITools()</code> returns the full set of tools, especially after Durable Object hibernation when connections are being restored in the background.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ChatAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> AIChatAgent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Default — waits up to 10 seconds</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // waitForMcpConnections = { timeout: 10_000 };</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Wait forever</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Disable waiting</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ChatAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> AIChatAgent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Default — waits up to 10 seconds</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // waitForMcpConnections = { timeout: 10_000 };</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Wait forever</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Disable waiting</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitForMcpConnections</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Value</th> <th>Behavior</th> </tr> </thead> <tbody> <tr> <td><code>{ timeout: 10_000 }</code></td> <td>Wait up to 10 seconds (default)</td> </tr> <tr> <td><code>{ timeout: N }</code></td> <td>Wait up to <code>N</code> milliseconds</td> </tr> <tr> <td><code>true</code></td> <td>Wait indefinitely until all connections ready</td> </tr> <tr> <td><code>false</code></td> <td>Do not wait (old behavior before 0.2.0)</td> </tr> </tbody> </table></div> <p>For lower-level control, call <code>this.mcp.waitForConnections()</code> directly inside <code>onChatMessage</code> instead.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>MCP deduplication by name and URL</strong> — <code>addMcpServer</code> with HTTP transport now deduplicates on both server name and URL. Calling it with the same name but a different URL creates a new connection. URLs are normalized before comparison (trailing slashes, default ports, hostname case).</li> <li><strong><code>callbackHost</code> optional for non-OAuth servers</strong> — <code>addMcpServer</code> no longer requires <code>callbackHost</code> when connecting to MCP servers that do not use OAuth.</li> <li><strong>MCP URL security</strong> — Server URLs are validated before connection to prevent SSRF. Private IP ranges, loopback addresses, link-local addresses, and cloud metadata endpoints are blocked.</li> <li><strong>Custom denial messages</strong> — <code>addToolOutput</code> now supports <code>state: "output-error"</code> with <code>errorText</code> for custom denial messages in human-in-the-loop tool approval flows.</li> <li><strong><code>requestId</code> in chat options</strong> — <code>onChatMessage</code> options now include a <code>requestId</code> for logging and correlating events.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/ai-chat@latest</span></span></code></pre></figure>Mon, 02 Mar 2026 00:00:00 GMTAgentsAgentsWorkersAI Gateway - Get started with AI Gateway automaticallyhttps://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/https://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/<p>You can now start using AI Gateway with a single API call — no setup required. Use <code>default</code> as your gateway ID, and AI Gateway creates one for you automatically on the first request.</p> <p>To try it out, <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">create an API token</a> with <code>AI Gateway - Read</code>, <code>AI Gateway - Edit</code>, and <code>Workers AI - Read</code> permissions, then run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/</span><span class="nb-shiki-140thh">$CLOUDFLARE_ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/default/compat/chat/completions</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> "cf-aig-authorization: Bearer </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "model": "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "What is Cloudflare?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>AI Gateway gives you logging, caching, rate limiting, and access to multiple AI providers through a single endpoint. For more information, refer to <a href="https://developers.cloudflare.com/ai-gateway/get-started/">Get started</a>.</p>Mon, 02 Mar 2026 00:00:00 GMTAI GatewayAI GatewayCloudflare One - Copy Cloudflare One resources as JSON or POST requestshttps://developers.cloudflare.com/changelog/post/2026-03-copy-resources-as-json-or-post-requests/https://developers.cloudflare.com/changelog/post/2026-03-copy-resources-as-json-or-post-requests/<p>You can now copy Cloudflare One resources as JSON or as a ready-to-use API POST request directly from the dashboard. This makes it simple to transition workflows into API calls, automation scripts, or infrastructure-as-code pipelines.</p> <p>To use this feature, click the overflow menu (⋮) on any supported resource and select <strong>Copy as JSON</strong> or <strong>Copy as POST request</strong>. The copied output includes only the fields present on your resource, giving you a clean and minimal starting point for your own API calls.</p> <p>Initially supported resources:</p> <ul> <li>Access applications</li> <li>Access policies</li> <li>Gateway policies</li> <li>Resolver policies</li> <li>Service tokens</li> <li>Identity providers</li> </ul> <p>We will continue to add support for more resources throughout 2026.</p>Mon, 02 Mar 2026 00:00:00 GMTCloudflare OneCloudflare OneWAF - WAF Release - 2026-03-02https://developers.cloudflare.com/changelog/post/2026-03-02-waf-release/https://developers.cloudflare.com/changelog/post/2026-03-02-waf-release/ <p>This week's release introduces new detections for vulnerabilities in SmarterTools SmarterMail (CVE-2025-52691 and CVE-2026-23760), alongside improvements to an existing Command Injection (nslookup) detection to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2025-52691: SmarterTools SmarterMail mail server is vulnerable to Arbitrary File Upload, allowing an unauthenticated attacker to upload files to any location on the mail server, potentially enabling remote code execution.</li> <li>CVE-2026-23760: SmarterTools SmarterMail versions prior to build 9511 contain an authentication bypass vulnerability in the password reset API permitting unaunthenticated to reset system administrator accounts failing to verify existing password or reset token.</li> </ul> <p><strong>Impact</strong></p> <p>Successful exploitation of these SmarterMail vulnerabilities could lead to full system compromise or unauthorized administrative access to mail servers. Administrators are strongly encouraged to apply vendor patches without delay.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0f282f3c89614779966faf52966ec6b1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...966ec6b1</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>SmarterMail - Arbitrary File Upload - CVE-2025-52691</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="35978af68e374a059e397bf5ee964a8c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ee964a8c</span></button></rule-id></td><td>N/A</td><td>SmarterMail - Authentication Bypass - CVE-2026-23760</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4bb099bcd71141d4a35c1aa675b64d99"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...75b64d99</span></button></rule-id></td><td>N/A</td><td>Command Injection - Nslookup - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "Command Injection - Nslookup" (ID: <rule-id id="f4a310393c564d50bd585601b090ba9a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b090ba9a</span></button></rule-id>)</td></tr></tbody></table>Mon, 02 Mar 2026 00:00:00 GMTWAFWAFAccess - Clipboard controls for browser-based RDPhttps://developers.cloudflare.com/changelog/post/2026-03-01-rdp-clipboard-controls/https://developers.cloudflare.com/changelog/post/2026-03-01-rdp-clipboard-controls/<p>You can now configure clipboard controls for browser-based RDP with Cloudflare Access. Clipboard controls allow administrators to restrict whether users can copy or paste text between their local machine and the remote Windows server.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2000,height=546,format=webp/_astro/rdp-clipboard-controls.B0ZmliDb.png" alt="Enable users to copy and paste content from their local machine to remote RDP sessions in the Cloudflare One dashboard" loading="lazy" decoding="async" width="2000" height="546"> <p>This feature is useful for organizations that support bring-your-own-device (BYOD) policies or third-party contractors using unmanaged devices. By restricting clipboard access, you can prevent sensitive data from being transferred out of the remote session to a user's personal device.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration-options">Configuration options</h4><a class="anchor-link" href="#configuration-options"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Clipboard controls are configured per policy within your Access application. For each policy, you can independently allow or deny:</p> <ul> <li><strong>Copy from local client to remote RDP session</strong> — Users can copy/paste text from their local machine into the browser-based RDP session.</li> <li><strong>Copy from remote RDP session to local client</strong> — Users can copy/paste text from the browser-based RDP session to their local machine.</li> </ul> <p>By default, both directions are denied for new policies. For existing Access applications created before this feature was available, clipboard access remains enabled to preserve backwards compatibility.</p> <p>When a user attempts a restricted clipboard action, the clipboard content is replaced with an error message informing them that the action is not allowed.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#clipboard-controls">Clipboard controls for browser-based RDP</a>.</p>Sun, 01 Mar 2026 00:00:00 GMTAccessAccessAccess - Export MCP server portal logs with Logpushhttps://developers.cloudflare.com/changelog/post/2026-02-27-mcp-portal-logpush/https://developers.cloudflare.com/changelog/post/2026-02-27-mcp-portal-logpush/<aside role="note" aria-label="Availability" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Availability</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Only available on Enterprise plans.</p></div></div></aside> <p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portals</a> now supports <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a> integration. You can automatically export MCP server portal activity logs to third-party storage destinations or security information and event management (SIEM) tools for analysis and auditing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="available-log-fields">Available log fields</h4><a class="anchor-link" href="#available-log-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The MCP server portal logs dataset includes fields such as:</p> <ul> <li><code>Datetime</code> — Timestamp of the request</li> <li><code>PortalID</code> / <code>PortalAUD</code> — Portal identifiers</li> <li><code>ServerID</code> / <code>ServerURL</code> — Upstream MCP server details</li> <li><code>Method</code> — JSON-RPC method (for example, <code>tools/call</code>, <code>prompts/get</code>, <code>resources/read</code>)</li> <li><code>ToolCallName</code> / <code>PromptGetName</code> / <code>ResourceReadURI</code> — Method-specific identifiers</li> <li><code>UserID</code> / <code>UserEmail</code> — Authenticated user information</li> <li><code>Success</code> / <code>Error</code> — Request outcome</li> <li><code>ServerResponseDurationMs</code> — Response time from upstream server</li> </ul> <p>For the complete field reference, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/mcp_portal_logs/">MCP portal logs</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="set-up-logpush">Set up Logpush</h4><a class="anchor-link" href="#set-up-logpush"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To configure Logpush for MCP server portal logs, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/">Logpush integration</a>.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>MCP server portals is currently in beta.</p></div></div></aside>Fri, 27 Feb 2026 00:00:00 GMTAccessAccessGateway - New protocols added for Gateway Protocol Detection (Beta)https://developers.cloudflare.com/changelog/post/2026-02-27-new-protocol-detection-protocols/https://developers.cloudflare.com/changelog/post/2026-02-27-new-protocol-detection-protocols/<p>Gateway <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/">Protocol Detection</a> now supports seven additional protocols in beta:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Protocol</th> <th>Notes</th> </tr> </thead> <tbody> <tr> <td>IMAP</td> <td>Internet Message Access Protocol — email retrieval</td> </tr> <tr> <td>POP3</td> <td>Post Office Protocol v3 — email retrieval</td> </tr> <tr> <td>SMTP</td> <td>Simple Mail Transfer Protocol — email sending</td> </tr> <tr> <td>MYSQL</td> <td>MySQL database wire protocol</td> </tr> <tr> <td>RSYNC-DAEMON</td> <td>rsync daemon protocol</td> </tr> <tr> <td>LDAP</td> <td>Lightweight Directory Access Protocol</td> </tr> <tr> <td>NTP</td> <td>Network Time Protocol</td> </tr> </tbody> </table></div> <p>These protocols join the existing set of detected protocols (HTTP, HTTP2, SSH, TLS, DCERPC, MQTT, and TPKT) and can be used with the <em>Detected Protocol</em> selector in <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network policies</a> to identify and filter traffic based on the application-layer protocol, without relying on port-based identification.</p> <p>If protocol detection is enabled on your account, these protocols will automatically be logged when detected in your Gateway network traffic.</p> <p>For more information on using Protocol Detection, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/">Protocol detection documentation</a>.</p>Fri, 27 Feb 2026 00:00:00 GMTGatewayGatewayRadar - Post-Quantum Encryption and Key Transparency on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-02-27-radar-pq-key-transparency/https://developers.cloudflare.com/changelog/post/2026-02-27-radar-pq-key-transparency/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now tracks post-quantum encryption support on origin servers, provides a tool to test any host for post-quantum compatibility, and introduces a Key Transparency dashboard for monitoring end-to-end encrypted messaging audit logs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="post-quantum-origin-support">Post-quantum origin support</h4><a class="anchor-link" href="#post-quantum-origin-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/"><code>Post-Quantum</code></a> API provides the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/subresources/tls/methods/support/"><code>/post_quantum/tls/support</code></a> - Tests whether a host supports post-quantum TLS key exchange.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/methods/summary/"><code>/post_quantum/origin/summary/{dimension}</code></a> - Returns origin post-quantum data summarized by key agreement algorithm.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/methods/timeseries_groups/"><code>/post_quantum/origin/timeseries_groups/{dimension}</code></a> - Returns origin post-quantum timeseries data grouped by key agreement algorithm.</li> </ul> <p>The new <a href="https://radar.cloudflare.com/post-quantum" target="_blank" rel="noopener">Post-Quantum Encryption<span class="external-link"> ↗</span></a> page shows the share of customer origins supporting <a href="https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-support/#x25519mlkem768">X25519MLKEM768</a>, derived from daily automated TLS scans of TLS 1.3-compatible origins. The scanner tests for algorithm support rather than the origin server's configured preference.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1040,format=webp/_astro/pq-origin-support.Bn5Dw_It.png" alt="Screenshot of the origin post-quantum support graph on Radar" loading="lazy" decoding="async" width="1600" height="1040"> <p>A host test tool allows checking any publicly accessible website for post-quantum encryption compatibility. Enter a hostname and optional port to see whether the server negotiates a post-quantum key exchange algorithm.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2372,height=566,format=webp/_astro/pq-host-test.dRqwoOvo.png" alt="Screenshot of the post-quantum host test tool on Radar" loading="lazy" decoding="async" width="2372" height="566"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-transparency">Key Transparency</h4><a class="anchor-link" href="#key-transparency"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <a href="https://radar.cloudflare.com/key-transparency" target="_blank" rel="noopener">Key Transparency<span class="external-link"> ↗</span></a> section displays the audit status of Key Transparency logs for end-to-end encrypted messaging services. The page launches with two monitored logs: WhatsApp and Facebook Messenger Transport.</p> <p>Each log card shows the current status, last signed epoch, last verified epoch, and the root hash of the Auditable Key Directory tree. The data is also available through the <a href="https://developers.cloudflare.com/key-transparency/api/">Key Transparency Auditor API</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2454,height=1062,format=webp/_astro/key-transparency-dashboard.DNQgLsb0.png" alt="Screenshot of the Key Transparency dashboard on Radar" loading="lazy" decoding="async" width="2454" height="1062"> <p>Learn more about these features in our <a href="https://blog.cloudflare.com/radar-origin-pq-key-transparency-aspa" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a> and check out the <a href="https://radar.cloudflare.com/post-quantum" target="_blank" rel="noopener">Post-Quantum Encryption<span class="external-link"> ↗</span></a> and <a href="https://radar.cloudflare.com/key-transparency" target="_blank" rel="noopener">Key Transparency<span class="external-link"> ↗</span></a> pages to explore the data.</p>Fri, 27 Feb 2026 00:00:00 GMTRadarRadarCache - Asynchronous stale-while-revalidatehttps://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/https://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/<p>Cloudflare's <a href="https://developers.cloudflare.com/cache/concepts/cache-control/#revalidation"><code>stale-while-revalidate</code></a> support is now fully asynchronous. Previously, the first request for a stale (expired) asset in cache had to wait for an origin response, after which that visitor received a REVALIDATED or EXPIRED status. Now, the first request after the asset expires triggers revalidation in the background and immediately receives stale content with an UPDATING status. All following requests also receive stale content with an <code>UPDATING</code> status until the origin responds, after which subsequent requests receive fresh content with a <code>HIT</code> status.</p> <p><code>stale-while-revalidate</code> is a <code>Cache-Control</code> directive set by your origin server that allows Cloudflare to serve an expired cached asset while a fresh copy is fetched from the origin.</p> <p>Asynchronous revalidation brings:</p> <ul> <li><strong>Lower latency</strong>: No visitor is waiting for the origin when the asset is already in cache. Every request is served from cache during revalidation.</li> <li><strong>Consistent experience</strong>: All visitors receive the same cached response during revalidation.</li> <li><strong>Reduced error exposure</strong>: The first request is no longer vulnerable to origin timeouts or errors. All visitors receive a cached response while revalidation happens in the background.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This change is live for all Free, Pro, and Business zones. Approximately 75% of Enterprise zones have been migrated, with the remaining zones rolling out throughout the quarter.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To use this feature, make sure your origin includes the <code>stale-while-revalidate</code> directive in the <code>Cache-Control</code> header. Refer to the <a href="https://developers.cloudflare.com/cache/concepts/cache-control/#revalidation">Cache-Control documentation</a> for details.</p>Thu, 26 Feb 2026 00:00:00 GMTCacheCacheCloudflare Fundamentals - Markdown responses for Cloudflare 1xxx errorshttps://developers.cloudflare.com/changelog/post/2026-02-26-markdown-responses-for-1xxx-errors/https://developers.cloudflare.com/changelog/post/2026-02-26-markdown-responses-for-1xxx-errors/<p>Cloudflare now returns structured Markdown responses for Cloudflare-generated 1xxx errors when clients send <code>Accept: text/markdown</code>.</p> <p>Each response includes YAML frontmatter plus guidance sections (<code>What happened</code> / <code>What you should do</code>) so agents can make deterministic retry and escalation decisions without parsing HTML.</p> <p>In measured 1,015 comparisons, Markdown reduced payload size and token footprint by over 98% versus HTML.</p> <p>Included frontmatter fields:</p> <ul> <li><code>error_code</code>, <code>error_name</code>, <code>error_category</code>, <code>http_status</code></li> <li><code>ray_id</code>, <code>timestamp</code>, <code>zone</code></li> <li><code>cloudflare_error</code>, <code>retryable</code>, <code>retry_after</code> (when applicable), <code>owner_action_required</code></li> </ul> <p>Default behavior is unchanged: clients that do not explicitly request Markdown continue to receive HTML error pages.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="negotiation-behavior">Negotiation behavior</h4><a class="anchor-link" href="#negotiation-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare uses standard HTTP content negotiation on the <code>Accept</code> header.</p> <ul> <li><code>Accept: text/markdown</code> -&gt; Markdown</li> <li><code>Accept: text/markdown, text/html;q=0.9</code> -&gt; Markdown</li> <li><code>Accept: text/*</code> -&gt; Markdown</li> <li><code>Accept: */*</code> -&gt; HTML (default browser behavior)</li> </ul> <p>When multiple values are present, Cloudflare selects the highest-priority supported media type using <code>q</code> values. If Markdown is not explicitly preferred, HTML is returned.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available now for Cloudflare-generated 1xxx errors.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: text/markdown"</span><span class="nb-shiki-mdbnqw"> https://</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">your-domai</span><span class="nb-shiki-140thh">n</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">/cdn-cgi/error/1015</span></span></code></pre></figure> <p>Reference: <a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/">Cloudflare 1xxx error documentation</a></p>Thu, 26 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsAgents, Workers - Agents SDK v0.6.0: RPC transport for MCP, optional OAuth, hardened schema conversion, and @cloudflare/ai-chat fixeshttps://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v0.6.0/https://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v0.6.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> lets you define an Agent and an McpAgent in the same Worker and connect them over RPC — no HTTP, no network overhead. It also makes OAuth opt-in for simple MCP connections, hardens the schema converter for production workloads, and ships a batch of <code>@cloudflare/ai-chat</code> reliability fixes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rpc-transport-for-mcp">RPC transport for MCP</h4><a class="anchor-link" href="#rpc-transport-for-mcp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now connect an Agent to an McpAgent in the same Worker using a Durable Object binding instead of an HTTP URL. The connection stays entirely within the Cloudflare runtime — no network round-trips, no serialization overhead.</p> <p>Pass the Durable Object namespace directly to <code>addMcpServer</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Connect via DO binding — no HTTP, no network overhead</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"counter"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">MY_MCP</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // With props for per-user context</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"counter"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">MY_MCP</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> props: { userId: </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">, role: </span><span class="nb-shiki-mdbnqw">"admin"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onStart</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Connect via DO binding — no HTTP, no network overhead</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"counter"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">MY_MCP</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // With props for per-user context</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"counter"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">MY_MCP</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> props: { userId: </span><span class="nb-shiki-mdbnqw">"user-123"</span><span class="nb-shiki-140thh">, role: </span><span class="nb-shiki-mdbnqw">"admin"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>The <code>addMcpServer</code> method now accepts <code>string | DurableObjectNamespace</code> as the second parameter with full TypeScript overloads, so HTTP and RPC paths are type-safe and cannot be mixed.</p> <p>Key capabilities:</p> <ul> <li><strong>Hibernation support</strong> — RPC connections survive Durable Object hibernation automatically. The binding name and props are persisted to storage and restored on wake-up, matching the behavior of HTTP MCP connections.</li> <li><strong>Deduplication</strong> — Calling <code>addMcpServer</code> with the same server name returns the existing connection instead of creating duplicates. Connection IDs are stable across hibernation restore.</li> <li><strong>Smaller surface area</strong> — The RPC transport internals have been rewritten and reduced from 609 lines to 245 lines. <code>RPCServerTransport</code> now uses <code>JSONRPCMessageSchema</code> from the MCP SDK for validation instead of hand-written checks.</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>RPC transport is experimental. The API may change based on feedback. Refer to <a href="https://github.com/cloudflare/agents/issues/565" target="_blank" rel="noopener">the tracking issue<span class="external-link"> ↗</span></a> for updates.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="optional-oauth-for-mcp-connections">Optional OAuth for MCP connections</h4><a class="anchor-link" href="#optional-oauth-for-mcp-connections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>addMcpServer()</code> no longer eagerly creates an OAuth provider for every connection. For servers that do not require authentication, a simple call is all you need:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// No callbackHost, no OAuth config — just works</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-server"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"https://mcp.example.com"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// No callbackHost, no OAuth config — just works</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">addMcpServer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-server"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"https://mcp.example.com"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div></div> <p>If the server responds with a 401, the SDK throws a clear error: <code>"This MCP server requires OAuth authentication. Provide callbackHost in addMcpServer options to enable the OAuth flow."</code> The restore-from-storage flow also handles missing callback URLs gracefully, skipping auth provider creation for non-OAuth servers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="hardened-json-schema-to-typescript-converter">Hardened JSON Schema to TypeScript converter</h4><a class="anchor-link" href="#hardened-json-schema-to-typescript-converter"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The schema converter used by <code>generateTypes()</code> and <code>getAITools()</code> now handles edge cases that previously caused crashes in production:</p> <ul> <li><strong>Depth and circular reference guards</strong> — Prevents stack overflows on recursive or deeply nested schemas</li> <li><strong><code>$ref</code> resolution</strong> — Supports internal JSON Pointers (<code>#/definitions/...</code>, <code>#/$defs/...</code>, <code>#</code>)</li> <li><strong>Tuple support</strong> — <code>prefixItems</code> (JSON Schema 2020-12) and array <code>items</code> (draft-07)</li> <li><strong>OpenAPI 3.0 <code>nullable: true</code></strong> — Supported across all schema branches</li> <li><strong>Per-tool error isolation</strong> — One malformed schema cannot crash the full pipeline in <code>generateTypes()</code> or <code>getAITools()</code></li> <li><strong>Missing <code>inputSchema</code> fallback</strong> — <code>getAITools()</code> falls back to <code>{ type: "object" }</code> instead of throwing</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflareai-chat-fixes"><code>@cloudflare/ai-chat</code> fixes</h4><a class="anchor-link" href="#cloudflareai-chat-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Tool denial flow</strong> — Denied tool approvals (<code>approved: false</code>) now transition to <code>output-denied</code> with a <code>tool_result</code>, fixing Anthropic provider compatibility. Custom denial messages are supported via <code>state: "output-error"</code> and <code>errorText</code>.</li> <li><strong>Abort/cancel support</strong> — Streaming responses now properly cancel the reader loop when the abort signal fires and send a done signal to the client.</li> <li><strong>Duplicate message persistence</strong> — <code>persistMessages()</code> now reconciles assistant messages by content and order, preventing duplicate rows when clients resend full history.</li> <li><strong><code>requestId</code> in <code>OnChatMessageOptions</code></strong> — Handlers can now send properly-tagged error responses for pre-stream failures.</li> <li><strong><code>redacted_thinking</code> preservation</strong> — The message sanitizer no longer strips Anthropic <code>redacted_thinking</code> blocks.</li> <li><strong><code>/get-messages</code> reliability</strong> — Endpoint handling moved from a prototype <code>onRequest()</code> override to a constructor wrapper, so it works even when users override <code>onRequest</code> without calling <code>super.onRequest()</code>.</li> <li><strong>Client tool APIs undeprecated</strong> — <code>createToolsFromClientSchemas</code>, <code>clientTools</code>, <code>AITool</code>, <code>extractClientToolSchemas</code>, and the <code>tools</code> option on <code>useAgentChat</code> are restored for SDK use cases where tools are defined dynamically at runtime.</li> <li><strong><code>jsonSchema</code> initialization</strong> — Fixed <code>jsonSchema not initialized</code> error when calling <code>getAITools()</code> in <code>onChatMessage</code>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/ai-chat@latest</span></span></code></pre></figure>Wed, 25 Feb 2026 00:00:00 GMTAgentsAgentsWorkersContainers - Run 15x more Containers with higher resource limitshttps://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/<p>You can now run more <a href="https://developers.cloudflare.com/containers/">Containers</a> concurrently with significantly higher limits on memory, vCPU, and disk.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Limit</th> <th>Previous Limit</th> <th>New Limit</th> </tr> </thead> <tbody> <tr> <td>Memory for concurrent live Container instances</td> <td>400GiB</td> <td>6TiB</td> </tr> <tr> <td>vCPU for concurrent live Container instances</td> <td>100</td> <td>1,500</td> </tr> <tr> <td>Disk for concurrent live Container instances</td> <td>2TB</td> <td>30TB</td> </tr> </tbody> </table></div> <p>This 15x increase enables larger-scale workloads on Containers. You can now run 15,000 instances of the <code>lite</code> instance type, 6,000 instances of <code>basic</code>, over 1,500 instances of <code>standard-1</code>, or over 1,000 instances of <code>standard-2</code> concurrently.</p> <p>Refer to <a href="https://developers.cloudflare.com/containers/platform-details/limits/">Limits</a> for more details on the available instance types and limits.</p>Wed, 25 Feb 2026 00:00:00 GMTContainersContainersRadar - RPKI ASPA Deployment Insights on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-02-25-radar-aspa-insights/https://developers.cloudflare.com/changelog/post/2026-02-25-radar-aspa-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes <a href="https://datatracker.ietf.org/doc/draft-ietf-sidrops-aspa-verification/" target="_blank" rel="noopener">Autonomous System Provider Authorization (ASPA)<span class="external-link"> ↗</span></a> deployment insights, providing visibility into the adoption and verification of ASPA objects across the global routing ecosystem.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-api-endpoints">New API endpoints</h4><a class="anchor-link" href="#new-api-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/"><code>ASPA</code></a> API provides the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/snapshot/"><code>/bgp/rpki/aspa/snapshot</code></a> - Retrieves current or historical ASPA objects.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/changes/"><code>/bgp/rpki/aspa/changes</code></a> - Retrieves changes to ASPA objects over time.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/timeseries/"><code>/bgp/rpki/aspa/timeseries</code></a> - Retrieves ASPA object counts over time as a timeseries.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-radar-widgets">New Radar widgets</h4><a class="anchor-link" href="#new-radar-widgets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">global routing page<span class="external-link"> ↗</span></a> now shows the ASPA deployment trend over time by counting daily ASPA objects.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=876,format=webp/_astro/aspa-global-trend.CXGWGFL4.png" alt="Screenshot of the ASPA deployment trend chart" loading="lazy" decoding="async" width="1600" height="876"> <p>The global routing page also displays the most recent ASPA objects, searchable by ASN or AS name.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1852,format=webp/_astro/aspa-global-table.vHUyNoTh.png" alt="Screenshot of the ASPA objects table" loading="lazy" decoding="async" width="1600" height="1852"> <p>On country and region routing pages, a new widget shows the ASPA deployment rate for ASNs registered in the selected country or region.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=876,format=webp/_astro/aspa-germany-trend.DIH6CESC.png" alt="Screenshot of the ASPA deployment trent chart for Germany" loading="lazy" decoding="async" width="1600" height="876"> <p>On AS routing pages, the connectivity table now includes checkmarks for ASPA-verified upstreams. All ASPA upstreams are listed in a dedicated table, and a timeline shows ASPA changes at daily granularity.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2198,height=1212,format=webp/_astro/aspa-asn-timeline.Bnl6upJs.png" alt="Screenshot of the ASPA changes timeline on an AS routing page" loading="lazy" decoding="async" width="2198" height="1212"> <p>Check out the <a href="https://radar.cloudflare.com/routing" target="_blank" rel="noopener">Radar routing page<span class="external-link"> ↗</span></a> to explore the data.</p>Wed, 25 Feb 2026 00:00:00 GMTRadarRadarWorkers - Better Windows support for Python Workershttps://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/https://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/<p><a href="https://github.com/cloudflare/workers-py?tab=readme-ov-file#pywrangler" target="_blank" rel="noopener">Pywrangler<span class="external-link"> ↗</span></a>, the CLI tool for managing Python Workers and packages, now supports Windows, allowing you to develop and deploy Python Workers from Windows environments. Previously, Pywrangler was only available on macOS and Linux.</p> <p>You can install and use Pywrangler on Windows the same way you would on other platforms. <a href="https://developers.cloudflare.com/workers/languages/python/packages/">Specify your Worker's Python dependencies</a> in your <code>pyproject.toml</code> file, then use the following commands to develop and deploy:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">uvx</span><span class="nb-shiki-dzsirb"> --from</span><span class="nb-shiki-mdbnqw"> workers-py</span><span class="nb-shiki-mdbnqw"> pywrangler</span><span class="nb-shiki-mdbnqw"> dev</span></span> <span class="line"><span class="nb-shiki-1t8gfj">uvx</span><span class="nb-shiki-dzsirb"> --from</span><span class="nb-shiki-mdbnqw"> workers-py</span><span class="nb-shiki-mdbnqw"> pywrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <p>All existing Pywrangler functionality, including package management, local development, and deployment, works on Windows without any additional configuration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="requirements">Requirements</h4><a class="anchor-link" href="#requirements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This feature requires the following minimum versions:</p> <ul> <li><code>wrangler</code> &gt;= 4.64.0</li> <li><code>workers-py</code> &gt;= 1.72.0</li> <li><code>uv</code> &gt;= 0.29.8</li> </ul> <p>To upgrade <code>workers-py</code> (which includes Pywrangler) in your project, run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">uv</span><span class="nb-shiki-mdbnqw"> tool</span><span class="nb-shiki-mdbnqw"> upgrade</span><span class="nb-shiki-mdbnqw"> workers-py</span></span></code></pre></figure> <p>To upgrade <code>wrangler</code>, run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-dzsirb"> -g</span><span class="nb-shiki-mdbnqw"> wrangler@latest</span></span></code></pre></figure> <p>To upgrade <code>uv</code>, run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">uv</span><span class="nb-shiki-mdbnqw"> self</span><span class="nb-shiki-mdbnqw"> update</span></span></code></pre></figure> <p>To get started with Python Workers on Windows, refer to the <a href="https://developers.cloudflare.com/workers/languages/python/packages/">Python packages documentation</a> for full details on Pywrangler.</p>Wed, 25 Feb 2026 00:00:00 GMTWorkersWorkersWorkers - Write structured queries to filter and search your Workers logs and traceshttps://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/https://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/<p><a href="https://developers.cloudflare.com/workers/observability/">Workers Observability</a> now includes a query language that lets you write structured queries directly in the search bar to filter your logs and traces. The search bar doubles as a free text search box — type any term to search across all metadata and attributes, or write field-level queries for precise filtering.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2630,height=1302,format=webp/_astro/2026-02-24-query-language.Ol8UX7m0.png" alt="Workers Observability search bar with autocomplete suggestions and Query Builder sidebar filters" loading="lazy" decoding="async" width="2630" height="1302"> <p>Queries written in the search bar sync with the <a href="https://developers.cloudflare.com/workers/observability/">Query Builder</a> sidebar, so you can write a query by hand and then refine it visually, or build filters in the Query Builder and see the corresponding query syntax. The search bar provides autocomplete suggestions for metadata fields and operators as you type.</p> <p>The query language supports:</p> <ul> <li><strong>Free text search</strong> — search everywhere with a keyword like <code>error</code>, or match an exact phrase with <code>"exact phrase"</code></li> <li><strong>Field queries</strong> — filter by specific fields using comparison operators (for example, <code>status = 500</code> or <code>$workers.wallTimeMs &gt; 100</code>)</li> <li><strong>Operators</strong> — <code>=</code>, <code>!=</code>, <code>&gt;</code>, <code>&gt;=</code>, <code>&lt;</code>, <code>&lt;=</code>, and <code>:</code> (contains)</li> <li><strong>Functions</strong> — <code>contains(field, value)</code>, <code>startsWith(field, prefix)</code>, <code>regex(field, pattern)</code>, and <code>exists(field)</code></li> <li><strong>Boolean logic</strong> — add conditions with <code>AND</code>, <code>OR</code>, and <code>NOT</code></li> </ul> <p>Select the help icon next to the search bar to view the full syntax reference, including all supported operators, functions, and keyboard shortcuts.</p> <p>Go to the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/" target="_blank" rel="noopener">Workers Observability dashboard<span class="external-link"> ↗</span></a> to try the query language.</p>Wed, 25 Feb 2026 00:00:00 GMTWorkersWorkersWorkers - No config? No problem. Just `wrangler deploy`https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/<p>You can now deploy any existing project to Cloudflare Workers — even without a Wrangler configuration file — and <code>wrangler deploy</code> will <em>just work</em>.</p> <p>Starting with Wrangler <strong>4.68.0</strong>, running <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy"><code>wrangler deploy</code></a> <a href="https://developers.cloudflare.com/workers/framework-guides/automatic-configuration/">automatically configures your project</a> by detecting your framework, installing required adapters, and deploying it to Cloudflare Workers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="using-wrangler-locally">Using Wrangler locally</h4><a class="anchor-link" href="#using-wrangler-locally"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <p>When you run <code>wrangler deploy</code> in a project without a configuration file, Wrangler:</p> <ol> <li>Detects your framework from <code>package.json</code></li> <li>Prompts you to confirm the detected settings</li> <li>Installs any required adapters</li> <li>Generates a <code>wrangler.jsonc</code> <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">configuration file</a></li> <li>Deploys your project to Cloudflare Workers</li> </ol> <p>You can also use <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#setup"><code>wrangler setup</code></a> to configure without deploying, or pass <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy"><code>--yes</code></a> to skip prompts.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="using-the-cloudflare-dashboard">Using the Cloudflare dashboard</h4><a class="anchor-link" href="#using-the-cloudflare-dashboard"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1918,height=1348,format=webp/_astro/automatic-pr.CwJG6Bec.png" alt="Automatic configuration pull request created by Workers Builds" loading="lazy" decoding="async" width="1918" height="1348"> <p>When you connect a repository through the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/create" target="_blank" rel="noopener">Workers dashboard<span class="external-link"> ↗</span></a>, a <a href="https://developers.cloudflare.com/workers/ci-cd/builds/automatic-prs/">pull request is generated</a> for you with all necessary files, and a <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">preview deployment</a> to check before merging.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>A pull request is only generated when your deploy command is <code>npx wrangler deploy</code>. If you use a custom deploy command, automatic configuration still runs but a PR is not created.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="background">Background</h4><a class="anchor-link" href="#background"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In December 2025, we <a href="https://developers.cloudflare.com/changelog/2025-12-16-wrangler-autoconfig/">introduced automatic configuration</a> as an experimental feature. It is now generally available and the default behavior.</p> <p>If you have questions or run into issues, join the <a href="https://github.com/cloudflare/workers-sdk/discussions/11667" target="_blank" rel="noopener">GitHub discussion<span class="external-link"> ↗</span></a>.</p>Wed, 25 Feb 2026 00:00:00 GMTWorkersWorkersCloudflare One Client - WARP client for Windows (version 2026.1.150.0)https://developers.cloudflare.com/changelog/post/2026-02-24-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-02-24-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improvements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/">multi-user mode</a>. Fixed an issue where when switching from a pre-login registration to a user registration, Mobile Device Management (MDM) configuration association could be lost.</li> <li>Added a new feature to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#netbios-over-tcpip">manage NetBIOS over TCP/IP</a> functionality on the Windows client. NetBIOS over TCP/IP on the Windows client is now disabled by default and can be enabled in <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/">device profile settings</a>.</li> <li>Fixed an issue causing failure of the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion">local network exclusion</a> feature when configured with a timeout of <code>0</code>.</li> <li>Improvement for the Windows <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/client-certificate/">client certificate posture check</a> to ensure logged results are from checks that run once users log in.</li> <li>Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.</li> <li>Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.</li> <li>Fixed an issue causing DNS requests to fail with clients in Traffic and DNS mode.</li> <li>Improved service shutdown behavior in cases where the daemon is unresponsive.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 24 Feb 2026 01:15:23 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2026.1.150.0)https://developers.cloudflare.com/changelog/post/2026-02-24-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-02-24-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue causing failure of the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion">local network exclusion</a> feature when configured with a timeout of <code>0</code>.</li> <li>Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.</li> <li>Fixed an issue with DNS server configuration failures that caused tunnel connection delays.</li> <li>Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.</li> <li>Fixed an issue causing DNS requests to fail with clients in Traffic and DNS mode.</li> </ul> Tue, 24 Feb 2026 01:15:22 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Linux (version 2026.1.150.0)https://developers.cloudflare.com/changelog/post/2026-02-24-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-02-24-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p>WARP client version 2025.8.779.0 introduced an updated public key for Linux packages. The public key must be updated if it was installed before September 12, 2025 to ensure the repository remains functional after December 4, 2025. Instructions to make this update are available at <a href="https://pkg.cloudflareclient.com">pkg.cloudflareclient.com</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue causing failure of the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion">local network exclusion</a> feature when configured with a timeout of <code>0</code>.</li> <li>Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.</li> <li>Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.</li> <li>Fixed issues causing DNS requests to fail with clients in Traffic and DNS mode or DNS only mode.</li> </ul> Tue, 24 Feb 2026 00:14:20 GMTCloudflare One ClientCloudflare One ClientDurable Objects, Workers - deleteAll() now deletes Durable Object alarmhttps://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/https://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/<p><code>deleteAll()</code> now deletes a Durable Object alarm in addition to stored data for Workers with a compatibility date of <code>2026-02-24</code> or later. This change simplifies clearing a Durable Object's storage with a single API call.</p> <p>Previously, <code>deleteAll()</code> only deleted user-stored data for an object. Alarm usage stores metadata in an object's storage, which required a separate <code>deleteAlarm()</code> call to fully clean up all storage for an object. The <code>deleteAll()</code> change applies to both KV-backed and SQLite-backed Durable Objects.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Before: two API calls required to clear all storage</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">deleteAlarm</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">deleteAll</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Now: a single call clears both data and the alarm</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">deleteAll</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#deleteall">Storage API documentation</a>.</p>Tue, 24 Feb 2026 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersPipelines, Workers - Dropped event metrics, typed Pipelines bindings, and improved setuphttps://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/https://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/<p><a href="https://developers.cloudflare.com/pipelines/">Cloudflare Pipelines</a> ingests streaming data via <a href="https://developers.cloudflare.com/workers/">Workers</a> or HTTP endpoints, transforms it with SQL, and writes it to <a href="https://developers.cloudflare.com/r2/">R2</a> as Apache Iceberg tables. Today we're shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dropped-event-metrics">Dropped event metrics</h4><a class="anchor-link" href="#dropped-event-metrics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When <a href="https://developers.cloudflare.com/pipelines/streams/">stream</a> events don't match the expected schema, Pipelines accepts them during ingestion but drops them when attempting to deliver them to the <a href="https://developers.cloudflare.com/pipelines/sinks/">sink</a>. To help you identify the root cause of these issues, we are introducing a new dashboard and metrics that surface dropped events with detailed error messages.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3066,height=1466,format=webp/_astro/pipelines-error-log-dash.6JIa7r5d.png" alt="The Errors tab in the Cloudflare dashboard showing deserialization errors grouped by type with individual error details" loading="lazy" decoding="async" width="3066" height="1466"> <p>Dropped events can also be queried programmatically via the new <code>pipelinesUserErrorsAdaptiveGroups</code> GraphQL dataset. The dataset breaks down failures by specific error type (<code>missing_field</code>, <code>type_mismatch</code>, <code>parse_failure</code>, or <code>null_value</code>) so you can trace issues back to the source.</p> <figure class="nb-code-figure" data-nb-lang="graphql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="graphql" data-nb-lang="graphql"><code><span class="line"><span class="nb-shiki-1itgoe">query</span><span class="nb-shiki-1t8gfj"> GetPipelineUserErrors</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $accountTag</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">String</span><span class="nb-shiki-1itgoe">!</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $pipelineId</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">String</span><span class="nb-shiki-1itgoe">!</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $datetimeStart</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">Time</span><span class="nb-shiki-1itgoe">!</span></span> <span class="line"><span class="nb-shiki-1jdh33"> $datetimeEnd</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">Time</span><span class="nb-shiki-1itgoe">!</span></span> <span class="line"><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> viewer</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> accounts</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">filter</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-mdbnqw">accountTag</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$accountTag</span><span class="nb-shiki-140thh"> }) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> pipelinesUserErrorsAdaptiveGroups</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> limit</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">100</span></span> <span class="line"><span class="nb-shiki-1jdh33"> filter</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> pipelineId</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$pipelineId</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> datetime_geq</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$datetimeStart</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> datetime_leq</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1jdh33">$datetimeEnd</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1jdh33"> orderBy</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-dzsirb">count_DESC</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> ) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> count</span></span> <span class="line"><span class="nb-shiki-1jdh33"> dimensions</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> errorFamily</span></span> <span class="line"><span class="nb-shiki-1jdh33"> errorType</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For the full list of dimensions, error types, and additional query examples, refer to <a href="https://developers.cloudflare.com/pipelines/observability/metrics/#user-error-metrics">User error metrics</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="typed-pipelines-bindings">Typed Pipelines bindings</h4><a class="anchor-link" href="#typed-pipelines-bindings"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Sending data to a Pipeline from a Worker previously used a generic <code>Pipeline&lt;PipelineRecord&gt;</code> type, which meant schema mismatches (wrong field names, incorrect types) were only caught at runtime as dropped events.</p> <p>Running <code>wrangler types</code> now generates schema-specific TypeScript types for your <a href="https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers">Pipeline bindings</a>. TypeScript catches missing required fields and incorrect field types at compile time, before your code is deployed.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">declare</span><span class="nb-shiki-1itgoe"> namespace</span><span class="nb-shiki-1t8gfj"> Cloudflare</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-1t8gfj"> EcommerceStreamRecord</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> user_id</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> event_type</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> product_id</span><span class="nb-shiki-1itgoe">?:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> amount</span><span class="nb-shiki-1itgoe">?:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1itgoe"> interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> STREAM</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1itgoe"> import</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"cloudflare:pipelines"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">Pipeline</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Cloudflare</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">EcommerceStreamRecord</span><span class="nb-shiki-140thh">&gt;;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#typed-pipeline-bindings">Typed Pipeline bindings</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-pipelines-setup">Improved Pipelines setup</h4><a class="anchor-link" href="#improved-pipelines-setup"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Setting up a new Pipeline previously required multiple manual steps: creating an R2 bucket, enabling R2 Data Catalog, generating an API token, and configuring format, compression, and rolling policies individually.</p> <p>The <code>wrangler pipelines setup</code> command now offers a <strong>Simple</strong> setup mode that applies recommended defaults and automatically creates the <a href="https://developers.cloudflare.com/r2/buckets/">R2 bucket</a> and enables <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> if they do not already exist. Validation errors during setup prompt you to retry inline rather than restarting the entire process.</p> <p>For a full walkthrough, refer to the <a href="https://developers.cloudflare.com/pipelines/getting-started/">Getting started guide</a>.</p>Tue, 24 Feb 2026 00:00:00 GMTPipelinesPipelinesWorkersStream - Stream live inputs can now be disabled and enabledhttps://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/https://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/<p>You can now disable a live input to reject incoming RTMPS and SRT connections. When a live input is disabled, any broadcast attempts will fail to connect.</p> <p>This gives you more control over your live inputs:</p> <ul> <li>Temporarily pause an input without deleting it</li> <li>Programmatically end creator broadcasts</li> <li>Prevent new broadcasts from starting on a specific input</li> </ul> <p>To disable a live input via the API, set the <code>enabled</code> property to <code>false</code>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> PUT</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">https://api.cloudflare.com/client/v4/accounts/{</span><span class="nb-shiki-1t8gfj">account_id}/stream/live_inputs/</span><span class="nb-shiki-mdbnqw">{input_id}</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'{"enabled": false}'</span></span></code></pre></figure> <p>You can also disable or enable a live input from the <strong>Live inputs</strong> list page or the live input detail page in the Dashboard.</p> <p>All existing live inputs remain enabled by default. For more information, refer to <a href="https://developers.cloudflare.com/stream/stream-live/start-stream-live/">Start a live stream</a>.</p>Tue, 24 Feb 2026 00:00:00 GMTStreamStreamAgents, R2, Containers - Backup and restore API for Sandbox SDKhttps://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/<p><a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> now support <code>createBackup()</code> and <code>restoreBackup()</code> methods for creating and restoring point-in-time snapshots of directories.</p> <p>This allows you to restore environments quickly. For instance, in order to develop in a sandbox, you may need to include a user's codebase and run a build step. Unfortunately <code>git clone</code> and <code>npm install</code> can take minutes, and you don't want to run these steps every time the user starts their sandbox.</p> <p>Now, after the initial setup, you can just call <code>createBackup()</code>, then <code>restoreBackup()</code> the next time this environment is needed. This makes it practical to pick up exactly where a user left off, even after days of inactivity, without repeating expensive setup steps.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> sandbox</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getSandbox</span><span class="nb-shiki-140thh">(env.Sandbox, </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Make non-trivial changes to the file system</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">gitCheckout</span><span class="nb-shiki-140thh">(endUserRepo, { targetDir: </span><span class="nb-shiki-mdbnqw">"/workspace"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"npm install"</span><span class="nb-shiki-140thh">, { cwd: </span><span class="nb-shiki-mdbnqw">"/workspace"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Create a point-in-time backup of the directory</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> backup</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">createBackup</span><span class="nb-shiki-140thh">({ dir: </span><span class="nb-shiki-mdbnqw">"/workspace"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Store the handle for later use</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">put</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`backup:${</span><span class="nb-shiki-140thh">userId</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">(backup));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// ... in a future session...</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Restore instead of re-cloning and reinstalling</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">restoreBackup</span><span class="nb-shiki-140thh">(backup);</span></span></code></pre></figure> <p>Backups are stored in <a href="https://developers.cloudflare.com/r2">R2</a> and can take advantage of <a href="https://developers.cloudflare.com/sandbox/guides/backup-restore/#configure-r2-lifecycle-rules-for-automatic-cleanup">R2 object lifecycle rules</a> to ensure they do not persist forever.</p> <p>Key capabilities:</p> <ul> <li><strong>Persist and reuse across sandbox sessions</strong> — Easily store backup handles in KV, D1, or Durable Object storage for use in subsequent sessions</li> <li><strong>Usable across multiple instances</strong> — Fork a backup across many sandboxes for parallel work</li> <li><strong>Named backups</strong> — Provide optional human-readable labels for easier management</li> <li><strong>TTLs</strong> — Set time-to-live durations so backups are automatically removed from storage once they are no longer needed</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Backup and restore currently uses a FUSE overlay. Soon, native snapshotting at a lower level will be added to Containers and Sandboxes, improving speed and ergonomics. The current backup functionality provides a significant speed improvement over manually recreating a file system, but it will be further optimized in the future. The new snapshotting system will use a similar API, so changing to this system will be simple once it is available.</p></div></div></aside> <p>To get started, refer to the <a href="https://developers.cloudflare.com/sandbox/guides/backup-restore/">backup and restore guide</a> for setup instructions and usage patterns, or the <a href="https://developers.cloudflare.com/sandbox/api/backups/">Backups API reference</a> for full method documentation.</p>Mon, 23 Feb 2026 00:00:00 GMTAgentsAgentsR2ContainersHyperdrive - Hyperdrive no longer caches queries using STABLE PostgreSQL functionshttps://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/https://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/<p>Hyperdrive now treats queries containing PostgreSQL <code>STABLE</code> functions as uncacheable, in addition to <code>VOLATILE</code> functions.</p> <p>Previously, only functions <a href="https://www.postgresql.org/docs/current/xfunc-volatility.html" target="_blank" rel="noopener">that PostgreSQL categorizes<span class="external-link"> ↗</span></a> as <code>VOLATILE</code> (for example, <code>RANDOM()</code>, <code>LASTVAL()</code>) were detected as uncacheable. <code>STABLE</code> functions (for example, <code>NOW()</code>, <code>CURRENT_TIMESTAMP</code>, <code>CURRENT_DATE</code>) were incorrectly allowed to be cached.</p> <p>Because <code>STABLE</code> functions can return different results across different SQL statements within the same transaction, caching their results could serve stale or incorrect data. This change aligns Hyperdrive's caching behavior with PostgreSQL's function volatility semantics.</p> <p>If your queries use <code>STABLE</code> functions, and you were relying on them being cached, move the function call to your application code and pass the result as a query parameter. For example, instead of <code>WHERE created_at &gt; NOW()</code>, compute the timestamp in your Worker and pass it as <code>WHERE created_at &gt; $1</code>.</p> <p>Hyperdrive uses text-based pattern matching to detect uncacheable functions. References to function names like <code>NOW()</code> in SQL comments also cause the query to be marked as uncacheable.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/hyperdrive/concepts/query-caching/">Query caching</a> and <a href="https://developers.cloudflare.com/hyperdrive/observability/troubleshooting/">Troubleshoot and debug</a>.</p>Mon, 23 Feb 2026 00:00:00 GMTHyperdriveHyperdriveSecurity Center - Saved views for Threat Eventshttps://developers.cloudflare.com/changelog/post/2026-02-23-Saved-views-in-threat-events/https://developers.cloudflare.com/changelog/post/2026-02-23-Saved-views-in-threat-events/<p><strong>TL;DR:</strong> You can now create and save custom configurations of the Threat Events dashboard, allowing you to instantly return to specific filtered views — such as industry-specific attacks or regional Sankey flows — without manual reconfiguration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Threat intelligence is most effective when it is personalized. Previously, analysts had to manually re-apply complex filters (like combining specific industry datasets with geographic origins) every time they logged in. This update provides material value by:</p> <ul> <li>Analysts can now jump straight into "Known Ransomware Infrastructure" or "Retail Sector Targets" views with a single click, eliminating repetitive setup tasks</li> <li>Teams can ensure everyone is looking at the same data subsets by using standardized saved views, reducing the risk of missing critical patterns due to inconsistent filtering.</li> </ul> <p>Cloudforce One subscribers can start saving their custom views now in <a href="https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/threat-events" target="_blank" rel="noopener">Application Security &gt; Threat Intelligence &gt; Threat Events<span class="external-link"> ↗</span></a>.</p>Mon, 23 Feb 2026 00:00:00 GMTSecurity CenterSecurity CenterAgents, Workers - @cloudflare/codemode v0.1.0: a new runtime agnostic modular architecturehttps://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/https://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/ <p>The <a href="https://www.npmjs.com/package/@cloudflare/codemode" target="_blank" rel="noopener"><code>@cloudflare/codemode</code><span class="external-link"> ↗</span></a> package has been rewritten into a modular, runtime-agnostic SDK.</p> <p><a href="https://blog.cloudflare.com/code-mode/" target="_blank" rel="noopener">Code Mode<span class="external-link"> ↗</span></a> enables LLMs to write and execute code that orchestrates your tools, instead of calling them one at a time. This can (and does) yield significant token savings, reduces context window pressure and improves overall model performance on a task.</p> <p>The new <code>Executor</code> interface is runtime agnostic and comes with a prebuilt <code>DynamicWorkerExecutor</code> to run generated code in a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/">Dynamic Worker Loader</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Removed <code>experimental_codemode()</code> and <code>CodeModeProxy</code> — the package no longer owns an LLM call or model choice</li> <li>New import path: <code>createCodeTool()</code> is now exported from <code>@cloudflare/codemode/ai</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-features">New features</h4><a class="anchor-link" href="#new-features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong><code>createCodeTool()</code></strong> — Returns a standard AI SDK <code>Tool</code> to use in your AI agents.</li> <li><strong><code>Executor</code> interface</strong> — Minimal <code>execute(code, fns)</code> contract. Implement for any code sandboxing primitive or runtime.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dynamicworkerexecutor"><code>DynamicWorkerExecutor</code></h4><a class="anchor-link" href="#dynamicworkerexecutor"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Runs code in a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/">Dynamic Worker</a>. It comes with the following features:</p> <ul> <li><strong>Network isolation</strong> — <code>fetch()</code> and <code>connect()</code> blocked by default (<code>globalOutbound: null</code>) when using <code>DynamicWorkerExecutor</code></li> <li><strong>Console capture</strong> — <code>console.log/warn/error</code> captured and returned in <code>ExecuteResult.logs</code></li> <li><strong>Execution timeout</strong> — Configurable via <code>timeout</code> option (default 30s)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="usage">Usage</h4><a class="anchor-link" href="#usage"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createCodeTool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DynamicWorkerExecutor } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { streamText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> codemode</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodeTool</span><span class="nb-shiki-140thh">({ tools: myTools, executor });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: { codemode },</span></span> <span class="line"><span class="nb-shiki-140thh"> messages,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createCodeTool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode/ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DynamicWorkerExecutor } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/codemode"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { streamText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> executor</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> DynamicWorkerExecutor</span><span class="nb-shiki-140thh">({ loader: env.</span><span class="nb-shiki-dzsirb">LOADER</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> codemode</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createCodeTool</span><span class="nb-shiki-140thh">({ tools: myTools, executor });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: { codemode },</span></span> <span class="line"><span class="nb-shiki-140thh"> messages,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="wrangler-configuration">Wrangler configuration</h4><a class="anchor-link" href="#wrangler-configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "worker_loaders"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"LOADER"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">worker_loaders</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"LOADER"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>See the <a href="https://developers.cloudflare.com/agents/tools/codemode/">Code Mode documentation</a> for full API reference and examples.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> @cloudflare/codemode@latest</span></span></code></pre></figure>Fri, 20 Feb 2026 00:00:00 GMTAgentsAgentsWorkersCASB - Understand CASB findings instantly with Cloudy Summarieshttps://developers.cloudflare.com/changelog/post/2026-02-20-cloudy-in-casb/https://developers.cloudflare.com/changelog/post/2026-02-20-cloudy-in-casb/<p>You can now easily understand your SaaS security posture findings and why they were detected with <strong>Cloudy Summaries in CASB</strong>. This feature integrates Cloudflare's Cloudy AI directly into your CASB Posture Findings to automatically generate clear, plain-language summaries of complex security misconfigurations, third-party app risks, and data exposures.</p> <p>This allows security teams and IT administrators to drastically reduce triage time by immediately understanding the context, potential impact, and necessary remediation steps for any given finding—without needing to be an expert in every connected SaaS application.</p> <p>To view a summary, simply navigate to your Posture Findings in the Cloudflare One dashboard (under <strong>Cloud and SaaS findings</strong>) and open the finding details of a specific instance of a Finding.</p> <p>Cloudy Summaries are supported on all available integrations, including Microsoft 365, Google Workspace, Salesforce, GitHub, AWS, Slack, and Dropbox. See the full list of supported integrations <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/">here</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Contextual explanations</strong> — Quickly understand the specifics of a finding with plain-language summaries detailing exactly what was detected, from publicly shared sensitive files to risky third-party app scopes.</li> <li><strong>Clear risk assessment</strong> — Instantly grasp the potential security impact of the finding, such as data breach risks, unauthorized account access, or email spoofing vulnerabilities.</li> <li><strong>Actionable guidance</strong> — Get clear recommendations and next steps on how to effectively remediate the issue and secure your environment.</li> <li><strong>Built-in feedback</strong> — Help improve future AI summarization accuracy by submitting feedback directly using the thumbs-up and thumbs-down buttons.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Learn more about managing <a href="https://developers.cloudflare.com/cloudflare-one/cloud-and-saas-findings/">CASB Posture Findings</a> in Cloudflare.</li> </ul> <p>Cloudy Summaries in CASB are available to all Cloudflare CASB users today.</p>Fri, 20 Feb 2026 00:00:00 GMTCASBCASBCloudflare Tunnel, Cloudflare Tunnel for SASE - Manage Cloudflare Tunnel directly from the main Cloudflare Dashboardhttps://developers.cloudflare.com/changelog/post/2026-02-20-tunnel-core-dashboard/https://developers.cloudflare.com/changelog/post/2026-02-20-tunnel-core-dashboard/ <p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> is now available in the main Cloudflare Dashboard at <a href="https://dash.cloudflare.com/?to=/:account/tunnels" target="_blank" rel="noopener">Networking &gt; Tunnels<span class="external-link"> ↗</span></a>, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=894,format=webp/_astro/tunnel-core-dashboard.BGPqaHfo.gif" alt="Manage Tunnels in the Core Dashboard" loading="lazy" decoding="async" width="1800" height="894"> <p>This new experience provides everything you need to manage Tunnels for <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/">public applications</a>, including:</p> <ul> <li><strong>Full Tunnel lifecycle management</strong>: Create, configure, delete, and monitor all your Tunnels in one place.</li> <li><strong>Native integrations</strong>: View Tunnels by name when configuring <a href="https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/">DNS records</a> and <a href="https://developers.cloudflare.com/workers-vpc/">Workers VPC</a> — no more copy-pasting UUIDs.</li> <li><strong>Real-time visibility</strong>: Monitor <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/">replicas</a> and Tunnel <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/common-errors/#tunnel-status">health status</a> directly in the dashboard.</li> <li><strong>Routing map</strong>: Manage all ingress routes for your Tunnel, including <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/">public applications</a>, <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/">private hostnames</a>, <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-cidr/">private CIDRs</a>, and <a href="https://developers.cloudflare.com/workers-vpc/">Workers VPC services</a>, from a single interactive interface.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="choose-the-right-dashboard-for-your-use-case">Choose the right dashboard for your use case</h4><a class="anchor-link" href="#choose-the-right-dashboard-for-your-use-case"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Core Dashboard</strong>: Navigate to <a href="https://dash.cloudflare.com/?to=/:account/tunnels" target="_blank" rel="noopener">Networking &gt; Tunnels<span class="external-link"> ↗</span></a> to manage Tunnels for:</p> <ul> <li>Securing origin servers and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/">public applications</a> with CDN, WAF, Load Balancing, and DDoS protection</li> <li>Connecting <a href="https://developers.cloudflare.com/workers-vpc/">Workers to private services</a> via Workers VPC</li> </ul> <p><strong>Cloudflare One Dashboard</strong>: Navigate to <a href="https://one.dash.cloudflare.com/?to=/:account/networks/connectors" target="_blank" rel="noopener">Zero Trust &gt; Networks &gt; Connectors<span class="external-link"> ↗</span></a> to manage Tunnels for:</p> <ul> <li>Securing your public applications with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/self-hosted-public-app/">Zero Trust access policies</a></li> <li>Connecting users to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/">private applications</a></li> <li>Building a <a href="https://developers.cloudflare.com/reference-architecture/architectures/sase/#connecting-networks">private mesh network</a></li> </ul> <p>Both dashboards provide complete Tunnel management capabilities — choose based on your primary workflow.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>New to Tunnel? Learn how to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/">get started with Cloudflare Tunnel</a> or explore advanced use cases like <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/">securing SSH servers</a> or <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/deployment-guides/kubernetes/">running Tunnels in Kubernetes</a>.</p>Fri, 20 Feb 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEAI Gateway, Workers AI - AI dashboard experience improvementshttps://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/https://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/<p><a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> and <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> have received a series of dashboard improvements to help you get started faster and manage your AI workloads more easily.</p> <p><strong>Navigation and discoverability</strong></p> <p>AI now has its own top-level section in the Cloudflare dashboard sidebar, so you can find AI features without digging through menus.</p> <p><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2328,height=1140,format=webp/_astro/sidebar-navigation.BQNFBmAk.png" alt="AI sidebar navigation in the Cloudflare dashboard" loading="lazy" decoding="async" width="2328" height="1140"> <em>The new top-level AI section in the dashboard sidebar.</em></p> <p><strong>Onboarding and getting started</strong></p> <p><a href="https://developers.cloudflare.com/ai-gateway/get-started/">Getting started</a> with AI Gateway is now simpler. When you create your first gateway, we now show your gateway's OpenAI-compatible endpoint and step-by-step guidance to help you configure it. The Playground also includes helpful prompts, and usage pages have clear next steps if you have not made any requests yet.</p> <p><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2400,height=1232,format=webp/_astro/onboarding-flow.DZ7aMcHa.png" alt="AI Gateway onboarding flow" loading="lazy" decoding="async" width="2400" height="1232"> <em>The first-run setup experience for new gateways.</em></p> <p>We've also combined the previously separate code example sections into one view with dropdown selectors for API type, provider, SDK, and authentication method so you can now customize the exact code snippet you need from one place.</p> <p><strong>Dynamic Routing</strong></p> <ul> <li>The <a href="https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/">route builder</a> is now more performant and responsive.</li> <li>You can now copy route names to your clipboard with a single click.</li> <li>Code examples use the <a href="https://developers.cloudflare.com/ai-gateway/usage/universal/">Universal Endpoint</a> format, making it easier to integrate routes into your application.</li> </ul> <p><strong>Observability and analytics</strong></p> <ul> <li>Small monetary values now display correctly in <a href="https://developers.cloudflare.com/ai-gateway/observability/costs/">cost analytics</a> charts, so you can accurately track spending at any scale.</li> </ul> <p><strong>Accessibility</strong></p> <ul> <li>Improvements to keyboard navigation within the AI Gateway, specifically when exploring usage by <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/">provider</a>.</li> <li>Improvements to sorting and filtering components on the <a href="https://developers.cloudflare.com/workers-ai/models/">Workers AI</a> models page.</li> </ul> <p>For more information, refer to the <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway documentation</a>.</p>Thu, 19 Feb 2026 00:00:00 GMTAI GatewayAI GatewayWorkers AIDigital Experience Monitoring - DEX Supports EU Customer Metadata Boundaryhttps://developers.cloudflare.com/changelog/post/2026-02-19-dex-supports-cmb-eu/https://developers.cloudflare.com/changelog/post/2026-02-19-dex-supports-cmb-eu/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience Monitoring (DEX)</a> provides visibility into <a href="https://developers.cloudflare.com/warp-client/">WARP</a> device connectivity and performance to any internal or external application.</p> <p>Now, all DEX logs are fully compatible with Cloudflare's <a href="https://developers.cloudflare.com/data-localization/metadata-boundary/">Customer Metadata Boundary</a> (CMB) setting for the 'EU' (European Union), which ensures that DEX logs will not be stored outside the 'EU' when the option is configured.</p> <p>If a Cloudflare One customer using DEX enables CMB 'EU', they will not see any DEX data in the Cloudflare One dashboard. Customers can ingest DEX data via <a href="https://developers.cloudflare.com/logs/logpush/">LogPush</a>, and build their own analytics and dashboards.</p> <p>If a customer enables CMB in their account, they will see the following message in the Digital Experience dashboard: "DEX data is unavailable because Customer Metadata Boundary configuration is on. Use Cloudflare LogPush to export DEX datasets."</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2143,height=1221,format=webp/_astro/dex_supports_cmb.6YOLXjHN.png" alt="Digital Experience Monitoring message when Customer Metadata Boundary for the EU is enabled" loading="lazy" decoding="async" width="2143" height="1221">Thu, 19 Feb 2026 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringSecurity Center - Cloudforce One Threat events graphs are now visible in the dashboardhttps://developers.cloudflare.com/changelog/post/2026-02-19-threat-events-graphs/https://developers.cloudflare.com/changelog/post/2026-02-19-threat-events-graphs/<p>We have introduced dynamic visualizations to the Threat Events dashboard to help you better understand the threat landscape and identify emerging patterns at a glance.</p> <p>What's new:</p> <ul> <li><strong>Sankey Diagrams</strong>: Trace the flow of attacks from country of origin to target country to identify which regions are being hit hardest and where the threat infrastructure resides.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2652,height=1186,format=webp/_astro/2026-02-19-sankey-diagram.VZMSmdZL.png" alt="Sankey Diagram" loading="lazy" decoding="async" width="2652" height="1186"> <ul> <li><strong>Dataset Distribution over time</strong>: Instantly pivot your view to understand if a specific campaign is targeting your sector or if it is a broad-spectrum commodity attack.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2648,height=1176,format=webp/_astro/2026-02-19-events-over-time.CqD7VKqA.png" alt="Events over time" loading="lazy" decoding="async" width="2648" height="1176"> <ul> <li><strong>Enhanced Filtering</strong>: Use these visual tools to filter and drill down into specific attack vectors directly from the charts.</li> </ul> <p>Cloudforce One subscribers can explore these new views now in <a href="https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/threat-events" target="_blank" rel="noopener">Application Security &gt; Threat Intelligence &gt; Threat Events<span class="external-link"> ↗</span></a>.</p>Thu, 19 Feb 2026 00:00:00 GMTSecurity CenterSecurity CenterAnalytics - New cfWorker metric in Server-Timing headerhttps://developers.cloudflare.com/changelog/post/2026-02-18-cfworker-server-timing/https://developers.cloudflare.com/changelog/post/2026-02-18-cfworker-server-timing/<p>The Server-Timing header now includes a new <code>cfWorker</code> metric that measures time spent executing Cloudflare Workers, including any subrequests performed by the Worker. This helps developers accurately identify whether high Time to First Byte (TTFB) is caused by Worker processing or slow upstream dependencies.</p> <p>Previously, Worker execution time was included in the <code>edge</code> metric, making it harder to identify true edge performance. The new <code>cfWorker</code> metric provides this visibility:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Metric</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>edge</code></td> <td>Total time spent on the Cloudflare edge, including Worker execution</td> </tr> <tr> <td><code>origin</code></td> <td>Time spent fetching from the origin server</td> </tr> <tr> <td><code>cfWorker</code></td> <td>Time spent in Worker execution, including subrequests but excluding origin fetch time</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-response">Example response</h4><a class="anchor-link" href="#example-response"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">Server-Timing: cdn-cache; desc=DYNAMIC, edge; dur=20, origin; dur=100, cfWorker; dur=7</span></span></code></pre></figure> <p>In this example, the edge took 20ms, the origin took 100ms, and the Worker added just 7ms of processing time.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>cfWorker</code> metric is enabled by default if you have <a href="https://developers.cloudflare.com/web-analytics/">Real User Monitoring (RUM)</a> enabled. Otherwise, you can enable it using <a href="https://developers.cloudflare.com/rules/">Rules</a>.</p> <p>This metric is particularly useful for:</p> <ul> <li><strong>Performance debugging</strong>: Quickly determine if latency is caused by Worker code, external API calls within Workers, or slow origins.</li> <li><strong>Optimization targeting</strong>: Identify which component of your request path needs optimization.</li> <li><strong>Real User Monitoring (RUM)</strong>: Access detailed timing breakdowns directly from response headers for client-side analytics.</li> </ul> <p>For more information about Server-Timing headers, refer to the <a href="https://www.w3.org/TR/server-timing/" target="_blank" rel="noopener">W3C Server Timing specification<span class="external-link"> ↗</span></a>.</p>Wed, 18 Feb 2026 00:00:00 GMTAnalyticsAnalyticsAccess - Streamlined clientless browser isolation for private applicationshttps://developers.cloudflare.com/changelog/post/2026-02-17-clientless-access-for-private-apps/https://developers.cloudflare.com/changelog/post/2026-02-17-clientless-access-for-private-apps/<p>A new <strong>Allow clientless access</strong> setting makes it easier to connect users without a device client to internal applications, without using public DNS.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1117,height=206,format=webp/_astro/allow-clientless-access.BHKwQuVt.png" alt="Allow clientless access setting in the Cloudflare One dashboard" loading="lazy" decoding="async" width="1117" height="206"> <p>Previously, to provide clientless access to a private hostname or IP without a <a href="https://developers.cloudflare.com/cloudflare-one/networks/routes/add-routes/#add-a-published-application-route">published application</a>, you had to create a separate <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/">bookmark application</a> pointing to a prefixed <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/">Clientless Web Isolation</a> URL (for example, <code>https://&lt;your-teamname&gt;.cloudflareaccess.com/browser/https://10.0.0.1/</code>). This bookmark was visible to all users in the App Launcher, regardless of whether they had access to the underlying application.</p> <p>Now, you can manage clientless access directly within your <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/">private self-hosted application</a>. When <strong>Allow clientless access</strong> is turned on, users who pass your Access application policies will see a tile in their App Launcher pointing to the prefixed URL. Users must have <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/">remote browser permissions</a> to open the link.</p>Tue, 17 Feb 2026 00:00:00 GMTAccessAccessAccess - Policies for bookmark applicationshttps://developers.cloudflare.com/changelog/post/2026-02-17-policies-for-bookmarks/https://developers.cloudflare.com/changelog/post/2026-02-17-policies-for-bookmarks/<p>You can now assign <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Access policies</a> to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/">bookmark applications</a>. This lets you control which users see a bookmark in the <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/">App Launcher</a> based on identity, device posture, and other policy rules.</p> <p>Previously, bookmark applications were visible to all users in your organization. With policy support, you can now:</p> <ul> <li><strong>Tailor the App Launcher to each user</strong> — Users only see the applications they have access to, reducing clutter and preventing accidental clicks on irrelevant resources.</li> <li><strong>Restrict visibility of sensitive bookmarks</strong> — Limit who can view bookmarks to internal tools or partner resources based on group membership, identity provider, or device posture.</li> </ul> <p>Bookmarks support all <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Access policy configurations</a> except purpose justification, temporary authentication, and application isolation. If no policy is assigned, the bookmark remains visible to all users (maintaining backwards compatibility).</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/">Add bookmarks</a>.</p>Tue, 17 Feb 2026 00:00:00 GMTAccessAccessAgents, Workers - Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> adds built-in retry utilities, per-connection protocol message control, and a fully rewritten <code>@cloudflare/ai-chat</code> with data parts, tool approval persistence, and zero breaking changes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="retry-utilities">Retry utilities</h4><a class="anchor-link" href="#retry-utilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new <code>this.retry()</code> method lets you retry any async operation with exponential backoff and jitter. You can pass an optional <code>shouldRetry</code> predicate to bail early on non-retryable errors.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onRequest</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">retry</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-1t8gfj"> callUnreliableService</span><span class="nb-shiki-140thh">(), {</span></span> <span class="line"><span class="nb-shiki-140thh"> maxAttempts: </span><span class="nb-shiki-dzsirb">4</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldRetry</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">err</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-1itgoe"> !</span><span class="nb-shiki-140thh">(err </span><span class="nb-shiki-1itgoe">instanceof</span><span class="nb-shiki-1t8gfj"> PermanentError</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(data);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onRequest</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> data</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">retry</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> callUnreliableService</span><span class="nb-shiki-140thh">(), {</span></span> <span class="line"><span class="nb-shiki-140thh"> maxAttempts: </span><span class="nb-shiki-dzsirb">4</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldRetry</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">err</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1itgoe"> !</span><span class="nb-shiki-140thh">(err </span><span class="nb-shiki-1itgoe">instanceof</span><span class="nb-shiki-1t8gfj"> PermanentError</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(data);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Retry options are also available per-task on <code>queue()</code>, <code>schedule()</code>, <code>scheduleEvery()</code>, and <code>addMcpServer()</code>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Per-task retry configuration, persisted in SQLite alongside the task</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">schedule</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> Date.</span><span class="nb-shiki-1t8gfj">now</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-dzsirb"> 60_000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "sendReport"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { userId: </span><span class="nb-shiki-mdbnqw">"abc"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retry: { maxAttempts: </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Class-level retry defaults</span></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> static</span><span class="nb-shiki-1jdh33"> options</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retry: { maxAttempts: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Per-task retry configuration, persisted in SQLite alongside the task</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">schedule</span><span class="nb-shiki-140thh">(Date.</span><span class="nb-shiki-1t8gfj">now</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">+</span><span class="nb-shiki-dzsirb"> 60_000</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"sendReport"</span><span class="nb-shiki-140thh">, { userId: </span><span class="nb-shiki-mdbnqw">"abc"</span><span class="nb-shiki-140thh"> }, {</span></span> <span class="line"><span class="nb-shiki-140thh"> retry: { maxAttempts: </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Class-level retry defaults</span></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> static</span><span class="nb-shiki-1jdh33"> options</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> retry: { maxAttempts: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Retry options are validated eagerly at enqueue/schedule time, and invalid values throw immediately. Internal retries have also been added for workflow operations (<code>terminateWorkflow</code>, <code>pauseWorkflow</code>, and others) with Durable Object-aware error detection.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="per-connection-protocol-message-control">Per-connection protocol message control</h4><a class="anchor-link" href="#per-connection-protocol-message-control"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agents automatically send JSON text frames (identity, state, MCP server lists) to every WebSocket connection. You can now suppress these per-connection for clients that cannot handle them — binary-only devices, MQTT clients, or lightweight embedded systems.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldSendProtocolMessages</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">connection</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Suppress protocol messages for MQTT clients</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> subprotocol</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> ctx.request.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Sec-WebSocket-Protocol"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> subprotocol </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-mdbnqw"> "mqtt"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldSendProtocolMessages</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">connection</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Connection</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ConnectionContext</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Suppress protocol messages for MQTT clients</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> subprotocol</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> ctx.request.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Sec-WebSocket-Protocol"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> subprotocol </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-mdbnqw"> "mqtt"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Connections with protocol messages disabled still fully participate in RPC and regular messaging. Use <code>isConnectionProtocolEnabled(connection)</code> to check a connection's status at any time. The flag persists across Durable Object hibernation.</p> <p>See <a href="https://developers.cloudflare.com/agents/runtime/communication/protocol-messages/">Protocol messages</a> for full documentation.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflareai-chat-v010"><code>@cloudflare/ai-chat</code> v0.1.0</h4><a class="anchor-link" href="#cloudflareai-chat-v010"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The first stable release of <code>@cloudflare/ai-chat</code> ships alongside this release with a major refactor of <code>AIChatAgent</code> internals — new <code>ResumableStream</code> class, WebSocket <code>ChatTransport</code>, and simplified SSE parsing — with zero breaking changes. Existing code using <code>AIChatAgent</code> and <code>useAgentChat</code> works as-is.</p> <p>Key new features:</p> <ul> <li><strong>Data parts</strong> — Attach typed JSON blobs (<code>data-*</code>) to messages alongside text. Supports reconciliation (type+id updates in-place), append, and transient parts (ephemeral via <code>onData</code> callback). See <a href="https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/#data-parts">Data parts</a>.</li> <li><strong>Tool approval persistence</strong> — The <code>needsApproval</code> approval UI now survives page refresh and DO hibernation. The streaming message is persisted to SQLite when a tool enters <code>approval-requested</code> state.</li> <li><strong><code>maxPersistedMessages</code></strong> — Cap SQLite message storage with automatic oldest-message deletion.</li> <li><strong><code>body</code> option on <code>useAgentChat</code></strong> — Send custom data with every request (static or dynamic).</li> <li><strong>Incremental persistence</strong> — Hash-based cache to skip redundant SQL writes.</li> <li><strong>Row size guard</strong> — Automatic two-pass compaction when messages approach the SQLite 2 MB limit.</li> <li><strong><code>autoContinueAfterToolResult</code> defaults to <code>true</code></strong> — Client-side tool results and tool approvals now automatically trigger a server continuation, matching server-executed tool behavior. Set <code>autoContinueAfterToolResult: false</code> in <code>useAgentChat</code> to restore the previous behavior.</li> </ul> <p>Notable bug fixes:</p> <ul> <li>Resolved stream resumption race conditions</li> <li>Resolved an issue where <code>setMessages</code> functional updater sent empty arrays</li> <li>Resolved an issue where client tool schemas were lost after DO hibernation</li> <li>Resolved <code>InvalidPromptError</code> after tool approval (<code>approval.id</code> was dropped)</li> <li>Resolved an issue where message metadata was not propagated on broadcast/resume paths</li> <li>Resolved an issue where <code>clearAll()</code> did not clear in-memory chunk buffers</li> <li>Resolved an issue where <code>reasoning-delta</code> silently dropped data when <code>reasoning-start</code> was missed during stream resumption</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="synchronous-queue-and-schedule-getters">Synchronous queue and schedule getters</h4><a class="anchor-link" href="#synchronous-queue-and-schedule-getters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>getQueue()</code>, <code>getQueues()</code>, <code>getSchedule()</code>, <code>dequeue()</code>, <code>dequeueAll()</code>, and <code>dequeueAllByCallback()</code> were unnecessarily <code>async</code> despite only performing synchronous SQL operations. They now return values directly instead of wrapping them in Promises. This is backward compatible — existing code using <code>await</code> on these methods will continue to work.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Fix TypeScript "excessively deep" error</strong> — A depth counter on <code>CanSerialize</code> and <code>IsSerializableParam</code> types bails out to <code>true</code> after 10 levels of recursion, preventing the "Type instantiation is excessively deep" error with deeply nested types like AI SDK <code>CoreMessage[]</code>.</li> <li><strong>POST SSE keepalive</strong> — The POST SSE handler now sends <code>event: ping</code> every 30 seconds to keep the connection alive, matching the existing GET SSE handler behavior. This prevents POST response streams from being silently dropped by proxies during long-running tool calls.</li> <li><strong>Widened peer dependency ranges</strong> — Peer dependency ranges across packages have been widened to prevent cascading major bumps during 0.x minor releases. <code>@cloudflare/ai-chat</code> and <code>@cloudflare/codemode</code> are now marked as optional peer dependencies.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span><span class="nb-shiki-mdbnqw"> @cloudflare/ai-chat@latest</span></span></code></pre></figure>Tue, 17 Feb 2026 00:00:00 GMTAgentsAgentsWorkersCloudflare One, Cloudflare WAN, Cloudflare Network Firewall, Network Flow - Cloudflare One Product Name Updateshttps://developers.cloudflare.com/changelog/post/2026-02-17-product-name-updates/https://developers.cloudflare.com/changelog/post/2026-02-17-product-name-updates/<p>We are updating naming related to some of our Networking products to better clarify their place in the Zero Trust and Secure Access Service Edge (SASE) journey.</p> <p>We are retiring some older brand names in favor of names that describe exactly what the products do within your network. We are doing this to help customers build better, clearer mental models for comprehensive SASE architecture delivered on Cloudflare.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-changing">What's changing</h4><a class="anchor-link" href="#whats-changing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Magic WAN</strong> → <strong>Cloudflare WAN</strong></li> <li><strong>Magic WAN IPsec</strong> → <strong>Cloudflare IPsec</strong></li> <li><strong>Magic WAN GRE</strong> → <strong>Cloudflare GRE</strong></li> <li><strong>Magic WAN Connector</strong> → <strong>Cloudflare One Appliance</strong></li> <li><strong>Magic Firewall</strong> → <strong>Cloudflare Network Firewall</strong></li> <li><strong>Magic Network Monitoring</strong> → <strong>Network Flow</strong></li> <li><strong>Magic Cloud Networking</strong> → <strong>Cloudflare One Multi-cloud Networking</strong></li> </ul> <p><strong>No action is required by you</strong> — all functionality, existing configurations, and billing will remain exactly the same.</p> <p>For more information, visit the <a href="https://developers.cloudflare.com/cloudflare-one/">Cloudflare One documentation</a>.</p>Tue, 17 Feb 2026 00:00:00 GMTCloudflare OneCloudflare OneCloudflare WANCloudflare Network FirewallNetwork FlowContainers - Docker-in-Docker support added to Containers and Sandboxeshttps://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/https://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/<p><a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> and <a href="https://developers.cloudflare.com/containers/">Containers</a> now support running Docker for "Docker-in-Docker" setups. This is particularly useful when your end users or <a href="https://developers.cloudflare.com/agents">agents</a> want to run a full sandboxed development environment.</p> <p>This allows you to:</p> <ul> <li>Develop containerized applications with your Sandbox</li> <li>Run isolated test environments for images</li> <li>Build container images as part of CI/CD workflows</li> <li>Deploy arbitrary images supplied at runtime within a container</li> </ul> <p>For <a href="https://developers.cloudflare.com/sandbox/">Sandbox SDK</a> users, see the <a href="https://developers.cloudflare.com/sandbox/guides/docker-in-docker/">Docker-in-Docker guide</a> for instructions on combining Docker with the SandboxSDK. For general Containers usage, see the <a href="https://developers.cloudflare.com/containers/faq/#can-i-run-docker-inside-a-container-docker-in-docker">Containers FAQ</a>.</p>Tue, 17 Feb 2026 00:00:00 GMTContainersContainersCloudflare Fundamentals - Content encoding support for Markdown for Agents and other improvementshttps://developers.cloudflare.com/changelog/post/2026-02-16-markdown-for-agents-improvements/https://developers.cloudflare.com/changelog/post/2026-02-16-markdown-for-agents-improvements/<p>When AI systems request pages from any website that uses Cloudflare and has <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">Markdown for Agents</a> enabled, they can express the preference for <code>text/markdown</code> in the request: our network will automatically and efficiently convert the HTML to markdown, when possible, on the fly.</p> <p>This release adds the following improvements:</p> <ul> <li>The origin response limit was raised from 1 MB to 2 MB (2,097,152 bytes).</li> <li>We no longer require the origin to send the <code>content-length</code> header.</li> <li>We now support content encoded responses from the origin.</li> </ul> <p>If you haven’t enabled automatic Markdown conversion yet, visit the <a href="https://dash.cloudflare.com/?to=/:account/:zone/ai" target="_blank" rel="noopener">AI Crawl Control<span class="external-link"> ↗</span></a> section of the Cloudflare dashboard and enable <strong>Markdown for Agents</strong>.</p> <p>Refer to our <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">developer documentation</a> for more details.</p>Mon, 16 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2026-02-16https://developers.cloudflare.com/changelog/post/2026-02-16-waf-release/https://developers.cloudflare.com/changelog/post/2026-02-16-waf-release/ <p>This week’s release introduces new detections for CVE-2025-68645 and CVE-2025-31125.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2025-68645: A Local File Inclusion (LFI) vulnerability in the Webmail Classic UI of Zimbra Collaboration Suite (ZCS) 10.0 and 10.1 allows unauthenticated remote attackers to craft requests to the <code>/h/rest</code> endpoint, improperly influence internal dispatching, and include arbitrary files from the WebRoot directory.</li> <li>CVE-2025-31125: Vite, the JavaScript frontend tooling framework, exposes content of non-allowed files via <code>?inline&amp;import</code> when its development server is network-exposed, enabling unauthorized attackers to read arbitrary files and potentially leak sensitive information.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="695d76ff756844d384cab548833761f7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...833761f7</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Zimbra - Local File Inclusion - CVE:CVE-2025-68645</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="38fff9f3deba46a2abc10a8f950ed8c8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...950ed8c8</span></button></rule-id></td><td>N/A</td><td>Vite - WASM Import Path Traversal - CVE:CVE-2025-31125</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Mon, 16 Feb 2026 00:00:00 GMTWAFWAFWorkers - Quick Editor devtools replaced with log viewerhttps://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/https://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/<p>Cloudflare has deprecated the Workers Quick Editor dev tools inspector and replaced it with a lightweight log viewer.</p> <p>This aligns our logging with <code>wrangler tail</code> and gives us the opportunity to focus our efforts on bringing benefits from the work we have invested in observability, which would not be possible otherwise.</p> <p>We have made improvements to this logging viewer based on your feedback such that you can log object and array types, and easily clear the list of logs. This does not include class instances. Limitations are documented in the <a href="https://developers.cloudflare.com/workers/playground/">Workers Playground docs</a>.</p> <p>If you do need to develop your Worker with a remote inspector, you can still do this using Wrangler locally. Cloning a project from your quick editor to your computer for local development can be done with the <code>wrangler init --from-dash</code> command. For more information, refer to <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#init">Wrangler commands</a>.</p>Mon, 16 Feb 2026 00:00:00 GMTWorkersWorkersWorkers - New Best Practices guide for Workershttps://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/https://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/ <p>A new <a href="https://developers.cloudflare.com/workers/best-practices/workers-best-practices/">Workers Best Practices</a> guide provides opinionated recommendations for building fast, reliable, observable, and secure Workers. The guide draws on production patterns, Cloudflare internal usage, and best practices observed from developers building on Workers.</p> <p>Key guidance includes:</p> <ul> <li><strong>Keep your compatibility date current and enable <code>nodejs_compat</code></strong> — Ensure you have access to the latest runtime features and Node.js built-in modules.</li> </ul> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "main"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"src/index.ts"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_flags"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-worker"</span></span> <span class="line"><span class="nb-shiki-140thh">main = </span><span class="nb-shiki-mdbnqw">"src/index.ts"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_flags = [ </span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <ul> <li><strong>Generate binding types with <code>wrangler types</code></strong> — Never hand-write your <code>Env</code> interface. Let Wrangler generate it from your actual configuration to catch mismatches at compile time.</li> <li><strong>Stream request and response bodies</strong> — Avoid buffering large payloads in memory. Use <code>TransformStream</code> and <code>pipeTo</code> to stay within the 128 MB memory limit and improve time-to-first-byte.</li> <li><strong>Use bindings, not REST APIs</strong> — Bindings to KV, R2, D1, Queues, and other Cloudflare services are direct, in-process references with no network hop and no authentication overhead.</li> <li><strong>Use Queues and Workflows for background work</strong> — Move long-running or retriable tasks out of the critical request path. Use Queues for simple fan-out and buffering, and Workflows for multi-step durable processes.</li> <li><strong>Enable Workers Logs and Traces</strong> — Configure observability before deploying to production so you have data when you need to debug.</li> <li><strong>Avoid global mutable state</strong> — Workers reuse isolates across requests. Storing request-scoped data in module-level variables causes cross-request data leaks.</li> <li><strong>Always <code>await</code> or <code>waitUntil</code> your Promises</strong> — Floating promises cause silent bugs and dropped work.</li> <li><strong>Use Web Crypto for secure token generation</strong> — Never use <code>Math.random()</code> for security-sensitive operations.</li> </ul> <p>To learn more, refer to <a href="https://developers.cloudflare.com/workers/best-practices/workers-best-practices/">Workers Best Practices</a>.</p>Sun, 15 Feb 2026 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Access - Fine-grained permissions for Access policies and service tokenshttps://developers.cloudflare.com/changelog/post/2026-02-13-access-policy-service-token-permissions/https://developers.cloudflare.com/changelog/post/2026-02-13-access-policy-service-token-permissions/<p>Fine-grained permissions for <strong>Access policies</strong> and <strong>Access service tokens</strong> are available. These new resource-scoped roles expand the existing RBAC model, enabling administrators to grant permissions scoped to individual resources.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-roles">New roles</h4><a class="anchor-link" href="#new-roles"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Cloudflare Access policy admin</strong>: Can edit a specific <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Access policy</a> in an account.</li> <li><strong>Cloudflare Access service token admin</strong>: Can edit a specific <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/">Access service token</a> in an account.</li> </ul> <p>These roles complement the existing resource-scoped roles for Access applications, identity providers, and infrastructure targets.</p> <p>For more information:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles">Resource-scoped roles</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/scope/">Role scopes</a></li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Resource-scoped roles is currently in beta.</p></div></div></aside>Fri, 13 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsAccessCloudflare Fundamentals, SDK - Cloudflare Python SDK v5.0.0-beta.1 now availablehttps://developers.cloudflare.com/changelog/post/2026-02-13-cloudflare-python-v5.0.0-beta.1/https://developers.cloudflare.com/changelog/post/2026-02-13-cloudflare-python-v5.0.0-beta.1/<blockquote> <p><strong>Disclaimer:</strong> Please note that v5.0.0-beta.1 is in Beta and we are still testing it for stability.</p> </blockquote> <p>Full Changelog: <a href="https://github.com/cloudflare/cloudflare-python/compare/v4.3.1...v5.0.0-beta.1" target="_blank" rel="noopener">v4.3.1...v5.0.0-beta.1<span class="external-link"> ↗</span></a></p> <p>In this release, you'll see a large number of breaking changes. This is primarily due to a change in OpenAPI definitions, which our libraries are based off of, and codegen updates that we rely on to read those OpenAPI definitions and produce our SDK libraries. As the codegen is always evolving and improving, so are our code bases.</p> <p>There may be changes that are not captured in this changelog. Feel free to open an issue to report any inaccuracies, and we will make sure it gets into the changelog before the v5.0.0 release.</p> <p>Most of the breaking changes below are caused by improvements to the accuracy of the base OpenAPI schemas, which sometimes translates to breaking changes in downstream clients that depend on those schemas.</p> <p>Please ensure you read through the list of changes below and the migration guide before moving to this version - this will help you understand any down or upstream issues it may cause to your environments.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>The following resources have breaking changes. See the <a href="https://github.com/cloudflare/cloudflare-python/blob/main/docs/v5-migration-guide.md" target="_blank" rel="noopener">v5 Migration Guide<span class="external-link"> ↗</span></a> for detailed migration instructions.</strong></p> <ul> <li><code>abusereports</code></li> <li><code>acm.totaltls</code></li> <li><code>apigateway.configurations</code></li> <li><code>cloudforceone.threatevents</code></li> <li><code>d1.database</code></li> <li><code>intel.indicatorfeeds</code></li> <li><code>logpush.edge</code></li> <li><code>origintlsclientauth.hostnames</code></li> <li><code>queues.consumers</code></li> <li><code>radar.bgp</code></li> <li><code>rulesets.rules</code></li> <li><code>schemavalidation.schemas</code></li> <li><code>snippets</code></li> <li><code>zerotrust.dlp</code></li> <li><code>zerotrust.networks</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-api-resources">New API Resources</h4><a class="anchor-link" href="#new-api-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>abusereports</code> - Abuse report management</li> <li><code>abusereports.mitigations</code> - Abuse report mitigation actions</li> <li><code>ai.tomarkdown</code> - AI-powered markdown conversion</li> <li><code>aigateway.dynamicrouting</code> - AI Gateway dynamic routing configuration</li> <li><code>aigateway.providerconfigs</code> - AI Gateway provider configurations</li> <li><code>aisearch</code> - AI-powered search functionality</li> <li><code>aisearch.instances</code> - AI Search instance management</li> <li><code>aisearch.tokens</code> - AI Search authentication tokens</li> <li><code>alerting.silences</code> - Alert silence management</li> <li><code>brandprotection.logomatches</code> - Brand protection logo match detection</li> <li><code>brandprotection.logos</code> - Brand protection logo management</li> <li><code>brandprotection.matches</code> - Brand protection match results</li> <li><code>brandprotection.queries</code> - Brand protection query management</li> <li><code>cloudforceone.binarystorage</code> - CloudForce One binary storage</li> <li><code>connectivity.directory</code> - Connectivity directory services</li> <li><code>d1.database</code> - D1 database management</li> <li><code>diagnostics.endpointhealthchecks</code> - Endpoint health check diagnostics</li> <li><code>fraud</code> - Fraud detection and prevention</li> <li><code>iam.sso</code> - IAM Single Sign-On configuration</li> <li><code>loadbalancers.monitorgroups</code> - Load balancer monitor groups</li> <li><code>organizations</code> - Organization management</li> <li><code>organizations.organizationprofile</code> - Organization profile settings</li> <li><code>origintlsclientauth.hostnamecertificates</code> - Origin TLS client auth hostname certificates</li> <li><code>origintlsclientauth.hostnames</code> - Origin TLS client auth hostnames</li> <li><code>origintlsclientauth.zonecertificates</code> - Origin TLS client auth zone certificates</li> <li><code>pipelines</code> - Data pipeline management</li> <li><code>pipelines.sinks</code> - Pipeline sink configurations</li> <li><code>pipelines.streams</code> - Pipeline stream configurations</li> <li><code>queues.subscriptions</code> - Queue subscription management</li> <li><code>r2datacatalog</code> - R2 Data Catalog integration</li> <li><code>r2datacatalog.credentials</code> - R2 Data Catalog credentials</li> <li><code>r2datacatalog.maintenanceconfigs</code> - R2 Data Catalog maintenance configurations</li> <li><code>r2datacatalog.namespaces</code> - R2 Data Catalog namespaces</li> <li><code>radar.bots</code> - Radar bot analytics</li> <li><code>radar.ct</code> - Radar certificate transparency data</li> <li><code>radar.geolocations</code> - Radar geolocation data</li> <li><code>realtimekit.activesession</code> - Real-time Kit active session management</li> <li><code>realtimekit.analytics</code> - Real-time Kit analytics</li> <li><code>realtimekit.apps</code> - Real-time Kit application management</li> <li><code>realtimekit.livestreams</code> - Real-time Kit live streaming</li> <li><code>realtimekit.meetings</code> - Real-time Kit meeting management</li> <li><code>realtimekit.presets</code> - Real-time Kit preset configurations</li> <li><code>realtimekit.recordings</code> - Real-time Kit recording management</li> <li><code>realtimekit.sessions</code> - Real-time Kit session management</li> <li><code>realtimekit.webhooks</code> - Real-time Kit webhook configurations</li> <li><code>tokenvalidation.configuration</code> - Token validation configuration</li> <li><code>tokenvalidation.rules</code> - Token validation rules</li> <li><code>workers.beta</code> - Workers beta features</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-endpoints-existing-resources">New Endpoints (Existing Resources)</h4><a class="anchor-link" href="#new-endpoints-existing-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="acmtotaltls"><code>acm.totaltls</code></h4><a class="anchor-link" href="#acmtotaltls"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>edit()</code></li> <li><code>update()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudforceonethreatevents"><code>cloudforceone.threatevents</code></h4><a class="anchor-link" href="#cloudforceonethreatevents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>list()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="contentscanning"><code>contentscanning</code></h4><a class="anchor-link" href="#contentscanning"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>create()</code></li> <li><code>get()</code></li> <li><code>update()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dnsrecords"><code>dns.records</code></h4><a class="anchor-link" href="#dnsrecords"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>scan_list()</code></li> <li><code>scan_review()</code></li> <li><code>scan_trigger()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="intelindicatorfeeds"><code>intel.indicatorfeeds</code></h4><a class="anchor-link" href="#intelindicatorfeeds"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>create()</code></li> <li><code>delete()</code></li> <li><code>list()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="leakedcredentialchecksdetections"><code>leakedcredentialchecks.detections</code></h4><a class="anchor-link" href="#leakedcredentialchecksdetections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>get()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="queuesconsumers"><code>queues.consumers</code></h4><a class="anchor-link" href="#queuesconsumers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>list()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="radarai"><code>radar.ai</code></h4><a class="anchor-link" href="#radarai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>summary()</code></li> <li><code>timeseries()</code></li> <li><code>timeseries_groups()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="radarbgp"><code>radar.bgp</code></h4><a class="anchor-link" href="#radarbgp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>changes()</code></li> <li><code>snapshot()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workerssubdomains"><code>workers.subdomains</code></h4><a class="anchor-link" href="#workerssubdomains"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>delete()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zerotrustnetworks"><code>zerotrust.networks</code></h4><a class="anchor-link" href="#zerotrustnetworks"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>create()</code></li> <li><code>delete()</code></li> <li><code>edit()</code></li> <li><code>get()</code></li> <li><code>list()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="general-fixes-and-improvements">General Fixes and Improvements</h4><a class="anchor-link" href="#general-fixes-and-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="type-system--compatibility">Type System &amp; Compatibility</h4><a class="anchor-link" href="#type-system--compatibility"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Type inference improvements</strong>: Allow Pyright to properly infer TypedDict types within SequenceNotStr</li> <li><strong>Type completeness</strong>: Add missing types to method arguments and response models</li> <li><strong>Pydantic compatibility</strong>: Ensure compatibility with Pydantic versions prior to 2.8.0 when using additional fields</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="requestresponse-handling">Request/Response Handling</h4><a class="anchor-link" href="#requestresponse-handling"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Multipart form data</strong>: Correctly handle sending multipart/form-data requests with JSON data</li> <li><strong>Header handling</strong>: Do not send headers with default values set to omit</li> <li><strong>GET request headers</strong>: Don't send Content-Type header on GET requests</li> <li><strong>Response body model accuracy</strong>: Broad improvements to the correctness of models</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="parsing--data-processing">Parsing &amp; Data Processing</h4><a class="anchor-link" href="#parsing--data-processing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Discriminated unions</strong>: Correctly handle nested discriminated unions in response parsing</li> <li><strong>Extra field types</strong>: Parse extra field types correctly</li> <li><strong>Empty metadata</strong>: Ignore empty metadata fields during parsing</li> <li><strong>Singularization rules</strong>: Update resource name singularization rules for better consistency</li> </ul>Fri, 13 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsSDKWorkers, Agents, Workers AI - Introducing GLM-4.7-Flash on Workers AI, @cloudflare/tanstack-ai, and workers-ai-provider v3.1.1https://developers.cloudflare.com/changelog/post/2026-02-13-glm-4.7-flash-workers-ai/https://developers.cloudflare.com/changelog/post/2026-02-13-glm-4.7-flash-workers-ai/<p>We're excited to announce <strong>GLM-4.7-Flash</strong> on Workers AI, a fast and efficient text generation model optimized for multilingual dialogue and instruction-following tasks, along with the brand-new <a href="https://www.npmjs.com/package/@cloudflare/tanstack-ai" target="_blank" rel="noopener"><strong>@cloudflare/tanstack-ai</strong><span class="external-link"> ↗</span></a> package and <a href="https://www.npmjs.com/package/workers-ai-provider" target="_blank" rel="noopener"><strong>workers-ai-provider v3.1.1</strong><span class="external-link"> ↗</span></a>.</p> <p>You can now run AI agents entirely on Cloudflare. With GLM-4.7-Flash's multi-turn tool calling support, plus full compatibility with TanStack AI and the Vercel AI SDK, you have everything you need to build agentic applications that run completely at the edge.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="glm-47-flash--multilingual-text-generation-model">GLM-4.7-Flash — Multilingual Text Generation Model</h4><a class="anchor-link" href="#glm-47-flash--multilingual-text-generation-model"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/"><code>@cf/zai-org/glm-4.7-flash</code></a> is a multilingual model with a 131,072 token context window, making it ideal for long-form content generation, complex reasoning tasks, and multilingual applications.</p> <p><strong>Key Features and Use Cases:</strong></p> <ul> <li><strong>Multi-turn Tool Calling for Agents</strong>: Build AI agents that can call functions and tools across multiple conversation turns</li> <li><strong>Multilingual Support</strong>: Built to handle content generation in multiple languages effectively</li> <li><strong>Large Context Window</strong>: 131,072 tokens for long-form writing, complex reasoning, and processing long documents</li> <li><strong>Fast Inference</strong>: Optimized for low-latency responses in chatbots and virtual assistants</li> <li><strong>Instruction Following</strong>: Excellent at following complex instructions for code generation and structured tasks</li> </ul> <p>Use GLM-4.7-Flash through the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/">Workers AI binding</a> (<code>env.AI.run()</code>), the REST API at <code>/run</code> or <code>/v1/chat/completions</code>, <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a>, or via <a href="https://developers.cloudflare.com/workers-ai/configuration/ai-sdk/">workers-ai-provider</a> for the Vercel AI SDK.</p> <p>Pricing is available on the <a href="https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/">model page</a> or <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing page</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflaretanstack-ai-v011--tanstack-ai-adapters-for-workers-ai-and-ai-gateway">@cloudflare/tanstack-ai v0.1.1 — TanStack AI adapters for Workers AI and AI Gateway</h4><a class="anchor-link" href="#cloudflaretanstack-ai-v011--tanstack-ai-adapters-for-workers-ai-and-ai-gateway"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've released <code>@cloudflare/tanstack-ai</code>, a new package that brings Workers AI and AI Gateway support to <a href="https://tanstack.com/ai" target="_blank" rel="noopener">TanStack AI<span class="external-link"> ↗</span></a>. This provides a framework-agnostic alternative for developers who prefer TanStack's approach to building AI applications.</p> <p><strong>Workers AI adapters</strong> support four configuration modes — plain binding (<code>env.AI</code>), plain REST, AI Gateway binding (<code>env.AI.gateway(id)</code>), and AI Gateway REST — across all capabilities:</p> <ul> <li><strong>Chat</strong> (<code>createWorkersAiChat</code>) — Streaming chat completions with tool calling, structured output, and reasoning text streaming.</li> <li><strong>Image generation</strong> (<code>createWorkersAiImage</code>) — Text-to-image models.</li> <li><strong>Transcription</strong> (<code>createWorkersAiTranscription</code>) — Speech-to-text.</li> <li><strong>Text-to-speech</strong> (<code>createWorkersAiTts</code>) — Audio generation.</li> <li><strong>Summarization</strong> (<code>createWorkersAiSummarize</code>) — Text summarization.</li> </ul> <p><strong>AI Gateway adapters</strong> route requests from third-party providers — OpenAI, Anthropic, Gemini, Grok, and OpenRouter — through Cloudflare AI Gateway for caching, rate limiting, and unified billing.</p> <p>To get started:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-mdbnqw"> @cloudflare/tanstack-ai</span><span class="nb-shiki-mdbnqw"> @tanstack/ai</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai-provider-v311--transcription-speech-reranking-and-reliability">workers-ai-provider v3.1.1 — transcription, speech, reranking, and reliability</h4><a class="anchor-link" href="#workers-ai-provider-v311--transcription-speech-reranking-and-reliability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Workers AI provider for the <a href="https://ai-sdk.dev" target="_blank" rel="noopener">Vercel AI SDK<span class="external-link"> ↗</span></a> now supports three new capabilities beyond chat and image generation:</p> <ul> <li><strong>Transcription</strong> (<code>provider.transcription(model)</code>) — Speech-to-text with automatic handling of model-specific input formats across binding and REST paths.</li> <li><strong>Text-to-speech</strong> (<code>provider.speech(model)</code>) — Audio generation with support for voice and speed options.</li> <li><strong>Reranking</strong> (<code>provider.reranking(model)</code>) — Document reranking for RAG pipelines and search result ordering.</li> </ul> <figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createWorkersAI } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "workers-ai-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> experimental_transcribe,</span></span> <span class="line"><span class="nb-shiki-140thh"> experimental_generateSpeech,</span></span> <span class="line"><span class="nb-shiki-140thh"> rerank,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> workersai</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createWorkersAI</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> transcript</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> experimental_transcribe</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: workersai.</span><span class="nb-shiki-1t8gfj">transcription</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/openai/whisper-large-v3-turbo"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> audio: audioData,</span></span> <span class="line"><span class="nb-shiki-140thh"> mediaType: </span><span class="nb-shiki-mdbnqw">"audio/wav"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> speech</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> experimental_generateSpeech</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: workersai.</span><span class="nb-shiki-1t8gfj">speech</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/deepgram/aura-1"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> text: </span><span class="nb-shiki-mdbnqw">"Hello world"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> voice: </span><span class="nb-shiki-mdbnqw">"asteria"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> ranked</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> rerank</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: workersai.</span><span class="nb-shiki-1t8gfj">reranking</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/baai/bge-reranker-base"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> query: </span><span class="nb-shiki-mdbnqw">"What is machine learning?"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> documents: [</span><span class="nb-shiki-mdbnqw">"ML is a branch of AI."</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"The weather is sunny."</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>This release also includes a comprehensive reliability overhaul (v3.0.5):</p> <ul> <li><strong>Fixed streaming</strong> — Responses now stream token-by-token instead of buffering all chunks, using a proper <code>TransformStream</code> pipeline with backpressure.</li> <li><strong>Fixed tool calling</strong> — Resolved issues with tool call ID sanitization, conversation history preservation, and a heuristic that silently fell back to non-streaming mode when tools were defined.</li> <li><strong>Premature stream termination detection</strong> — Streams that end unexpectedly now report <code>finishReason: "error"</code> instead of silently reporting <code>"stop"</code>.</li> <li><strong>AI Search support</strong> — Added <code>createAISearch</code> as the canonical export (renamed from AutoRAG). <code>createAutoRAG</code> still works with a deprecation warning.</li> </ul> <p>To upgrade:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-mdbnqw"> workers-ai-provider@latest</span><span class="nb-shiki-mdbnqw"> ai</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resources">Resources</h4><a class="anchor-link" href="#resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://www.npmjs.com/package/@cloudflare/tanstack-ai" target="_blank" rel="noopener">@cloudflare/tanstack-ai on npm<span class="external-link"> ↗</span></a></li> <li><a href="https://www.npmjs.com/package/workers-ai-provider" target="_blank" rel="noopener">workers-ai-provider on npm<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/ai" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a></li> </ul>Fri, 13 Feb 2026 00:00:00 GMTWorkersWorkersAgentsWorkers AIWorkers VPC - Origin CA certificate support for Workers VPChttps://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/https://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/<p>Workers VPC now supports <a href="https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/">Cloudflare Origin CA certificates</a> when connecting to your private services over HTTPS. Previously, Workers VPC only trusted certificates issued by publicly trusted certificate authorities (for example, Let's Encrypt, DigiCert).</p> <p>With this change, you can use free Cloudflare Origin CA certificates on your origin servers within private networks and connect to them from Workers VPC using the <code>https</code> scheme. This is useful for encrypting traffic between the tunnel and your service without needing to provision certificates from a public CA.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/#supported-tls-certificates">Supported TLS certificates</a>.</p>Fri, 13 Feb 2026 00:00:00 GMTWorkers VPCWorkers VPCCloudflare WAN - Anycast IPs displayed on the dashboardhttps://developers.cloudflare.com/changelog/post/2026-02-12-anycast-ips-on-dashboard/https://developers.cloudflare.com/changelog/post/2026-02-12-anycast-ips-on-dashboard/<p>Cloudflare WAN now displays your Anycast IP addresses directly in the dashboard when you configure IPsec or GRE tunnels.</p> <p>Previously, customers received their Anycast IPs during onboarding or had to retrieve them with an API call. The dashboard now pre-loads these addresses, reducing setup friction and preventing configuration errors.</p> <p>No action is required. All Cloudflare WAN customers can see their Anycast IPs in the tunnel configuration form automatically.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-tunnel-endpoints/">Configure tunnel endpoints</a>.</p>Thu, 12 Feb 2026 00:00:00 GMTCloudflare WANCloudflare WANCloudflare Fundamentals - Introducing Markdown for Agentshttps://developers.cloudflare.com/changelog/post/2026-02-12-markdown-for-agents/https://developers.cloudflare.com/changelog/post/2026-02-12-markdown-for-agents/<p>Cloudflare's network now supports real-time content conversion at the source, for enabled zones using <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Content_negotiation" target="_blank" rel="noopener">content negotiation<span class="external-link"> ↗</span></a> headers. When AI systems request pages from any website that uses Cloudflare and has Markdown for Agents enabled, they can express the preference for <code>text/markdown</code> in the request: our network will automatically and efficiently convert the HTML to markdown, when possible, on the fly.</p> <p>Here is a curl example with the <code>Accept</code> negotiation header requesting this page from our developer documentation:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Accept: text/markdown"</span></span></code></pre></figure> <p>The response to this request is now formatted in markdown:</p> <figure class="nb-code-figure" data-nb-lang="http"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="http" data-nb-lang="http"><code><span class="line"><span class="nb-shiki-140thh">HTTP/2 </span><span class="nb-shiki-dzsirb">200</span></span> <span class="line"><span class="nb-shiki-17hn0y">date</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> Wed, 11 Feb 2026 11:44:48 GMT</span></span> <span class="line"><span class="nb-shiki-17hn0y">content-type</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> text/markdown; charset=utf-8</span></span> <span class="line"><span class="nb-shiki-17hn0y">content-length</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> 2899</span></span> <span class="line"><span class="nb-shiki-17hn0y">vary</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> accept</span></span> <span class="line"><span class="nb-shiki-17hn0y">x-markdown-tokens</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> 725</span></span> <span class="line"><span class="nb-shiki-17hn0y">content-signal</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> ai-train=yes, search=yes, ai-input=yes</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">---</span></span> <span class="line"><span class="nb-shiki-17hn0y">title</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> Markdown for Agents · Cloudflare Agents docs</span></span> <span class="line"><span class="nb-shiki-140thh">---</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">## What is Markdown for Agents</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">Markdown has quickly become the lingua franca for agents and AI systems</span></span> <span class="line"><span class="nb-shiki-140thh">as a whole. The format’s explicit structure makes it ideal for AI processing,</span></span> <span class="line"><span class="nb-shiki-140thh">ultimately resulting in better results while minimizing token waste.</span></span> <span class="line"><span class="nb-shiki-140thh">...</span></span></code></pre></figure> <p>Refer to our <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">developer documentation</a> and our <a href="https://blog.cloudflare.com/markdown-for-agents/" target="_blank" rel="noopener">blog announcement<span class="external-link"> ↗</span></a> for more details.</p>Thu, 12 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsRadar - Content Type Dimension for AI Bots in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2026-02-12-radar-ai-bots-content-type/https://developers.cloudflare.com/changelog/post/2026-02-12-radar-ai-bots-content-type/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes content type insights for AI bot and crawler traffic. The new <code>content_type</code> dimension and filter shows the distribution of content types returned to AI crawlers, grouped by MIME type category.</p> <p>The content type dimension and filter are available via the following API endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/bots/methods/summary_v2/"><code>/ai/bots/summary/content_type</code></a></li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/bots/methods/timeseries_groups/"><code>/ai/bots/timeseries_groups/content_type</code></a></li> </ul> <p>Content type categories:</p> <ul> <li><strong>HTML</strong> - Web pages (<code>text/html</code>)</li> <li><strong>Images</strong> - All image formats (<code>image/*</code>)</li> <li><strong>JSON</strong> - JSON data and API responses (<code>application/json</code>, <code>*+json</code>)</li> <li><strong>JavaScript</strong> - Scripts (<code>application/javascript</code>, <code>text/javascript</code>)</li> <li><strong>CSS</strong> - Stylesheets (<code>text/css</code>)</li> <li><strong>Plain Text</strong> - Unformatted text (<code>text/plain</code>)</li> <li><strong>Fonts</strong> - Web fonts (<code>font/*</code>, <code>application/font-*</code>)</li> <li><strong>XML</strong> - XML documents and feeds (<code>text/xml</code>, <code>application/xml</code>, <code>application/rss+xml</code>, <code>application/atom+xml</code>)</li> <li><strong>YAML</strong> - Configuration files (<code>text/yaml</code>, <code>application/yaml</code>)</li> <li><strong>Video</strong> - Video content and streaming (<code>video/*</code>, <code>application/ogg</code>, <code>*mpegurl</code>)</li> <li><strong>Audio</strong> - Audio content (<code>audio/*</code>)</li> <li><strong>Markdown</strong> - Markdown documents (<code>text/markdown</code>)</li> <li><strong>Documents</strong> - PDFs, Office documents, ePub, CSV (<code>application/pdf</code>, <code>application/msword</code>, <code>text/csv</code>)</li> <li><strong>Binary</strong> - Executables, archives, WebAssembly (<code>application/octet-stream</code>, <code>application/zip</code>, <code>application/wasm</code>)</li> <li><strong>Serialization</strong> - Binary API formats (<code>application/protobuf</code>, <code>application/grpc</code>, <code>application/msgpack</code>)</li> <li><strong>Other</strong> - All other content types</li> </ul> <p>Additionally, individual <a href="https://radar.cloudflare.com/bots/directory/gptbot" target="_blank" rel="noopener">bot information pages<span class="external-link"> ↗</span></a> now display content type distribution for AI crawlers that exist in both the Verified Bots and AI Bots datasets.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=874,format=webp/_astro/ai-bots-content-type.B7xP9p4S.png" alt="Screenshot of the Content Type Distribution chart on the AI Insights page" loading="lazy" decoding="async" width="1600" height="874"> <p>Check out the <a href="https://radar.cloudflare.com/ai-insights#content-type" target="_blank" rel="noopener">AI Insights page<span class="external-link"> ↗</span></a> to explore the data.</p>Thu, 12 Feb 2026 00:00:00 GMTRadarRadarSecurity Center - Enhanced Logo Matching for Brand Protectionhttps://developers.cloudflare.com/changelog/post/2026-02-12-brand-protection-logo-matching-percentage-selector/https://developers.cloudflare.com/changelog/post/2026-02-12-brand-protection-logo-matching-percentage-selector/<p>We have significantly upgraded our Logo Matching capabilities within Brand Protection. While previously limited to approximately 100% matches, users can now detect a wider range of brand assets through a redesigned matching model and UI.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Configurable match thresholds</strong>: Users can set a minimum match score (starting at 75%) when creating a logo query to capture subtle variations or high-quality impersonations.</li> <li><strong>Visual match scores</strong>: Allow users to see the exact percentage of the match directly in the results table, highlighted with color-coded lozenges to indicate severity.</li> <li><strong>Direct logo previews</strong>: Available in the Cloudflare dashboard — similar to string matches — to verify infringements at a glance.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Expose sophisticated impersonators</strong> who use slightly altered logos to bypass basic detection filters.</li> <li><strong>Faster triage</strong> of the most relevant threats immediately using visual indicators, reducing the time spent manually reviewing matches.</li> </ul> <p>Ready to protect your visual identity? Learn more in our <a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection documentation</a>.</p>Thu, 12 Feb 2026 00:00:00 GMTSecurity CenterSecurity CenterCloudflare Fundamentals, Terraform - Terraform v5.17.0 now availablehttps://developers.cloudflare.com/changelog/post/2026-02-12-terraform-v5.17.0-provider/https://developers.cloudflare.com/changelog/post/2026-02-12-terraform-v5.17.0-provider/<p>In January 2025, we announced the launch of the new Terraform v5 Provider. We greatly appreciate the proactive engagement and valuable feedback from the Cloudflare community following the v5 release. In response, we have established a consistent and rapid <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 week cadence<span class="external-link"> ↗</span></a> for releasing targeted improvements, demonstrating our commitment to stability and reliability.</p> <p>With the help of the community, we have a growing number of resources that we have marked as <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">stable<span class="external-link"> ↗</span></a>, with that list continuing to grow with every release. The most used <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">resources<span class="external-link"> ↗</span></a> are on track to be stable by the end of March 2026, when we will also be releasing a new migration tool to help you migrate from v4 to v5 with ease.</p> <p>This release brings new capabilities for AI Search, enhanced Workers Script placement controls, and numerous bug fixes based on community feedback. We also begun laying foundational work for improving the v4 to v5 migration process. Stay tuned for more details as we approach the March 2026 release timeline.</p> <p>Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>ai_search_instance:</strong> add data source for querying AI Search instances</li> <li><strong>ai_search_token:</strong> add data source for querying AI Search tokens</li> <li><strong>account:</strong> add support for tenant unit management with new <code>unit</code> field</li> <li><strong>account:</strong> add automatic mapping from <code>managed_by.parent_org_id</code> to <code>unit.id</code></li> <li><strong>authenticated_origin_pulls_certificate:</strong> add data source for querying authenticated origin pull certificates</li> <li><strong>authenticated_origin_pulls_hostname_certificate:</strong> add data source for querying hostname-specific authenticated origin pull certificates</li> <li><strong>authenticated_origin_pulls_settings:</strong> add data source for querying authenticated origin pull settings</li> <li><strong>workers_kv:</strong> add <code>value</code> field to data source to retrieve KV values directly</li> <li><strong>workers_script:</strong> add <code>script</code> field to data source to retrieve script content</li> <li><strong>workers_script:</strong> add support for <code>simple</code> rate limit binding</li> <li><strong>workers_script:</strong> add support for targeted placement mode with <code>placement.target</code> array for specifying placement targets (region, hostname, host)</li> <li><strong>workers_script:</strong> add <code>placement_mode</code> and <code>placement_status</code> computed fields</li> <li><strong>zero_trust_dex_test:</strong> add data source with filter support for finding specific tests</li> <li><strong>zero_trust_dlp_predefined_profile:</strong> add <code>enabled_entries</code> field for flexible entry management</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account:</strong> map <code>managed_by.parent_org_id</code> to <code>unit.id</code> in unmarshall and add acceptance tests</li> <li><strong>authenticated_origin_pulls_certificate:</strong> add certificate normalization to prevent drift</li> <li><strong>authenticated_origin_pulls:</strong> handle array response and implement full lifecycle</li> <li><strong>authenticated_origin_pulls_hostname_certificate:</strong> fix resource and tests</li> <li><strong>cloudforce_one_request_message:</strong> use correct <code>request_id</code> field instead of <code>id</code> in API calls</li> <li><strong>dns_zone_transfers_incoming:</strong> use correct <code>zone_id</code> field instead of <code>id</code> in API calls</li> <li><strong>dns_zone_transfers_outgoing:</strong> use correct <code>zone_id</code> field instead of <code>id</code> in API calls</li> <li><strong>email_routing_settings:</strong> use correct <code>zone_id</code> field instead of <code>id</code> in API calls</li> <li><strong>hyperdrive_config:</strong> add proper handling for write-only fields to prevent state drift</li> <li><strong>hyperdrive_config:</strong> add normalization for empty <code>mtls</code> objects to prevent unnecessary diffs</li> <li><strong>magic_network_monitoring_rule:</strong> use correct <code>account_id</code> field instead of <code>id</code> in API calls</li> <li><strong>mtls_certificates:</strong> fix resource and test</li> <li><strong>pages_project:</strong> revert build_config to computed optional</li> <li><strong>stream_key:</strong> use correct <code>account_id</code> field instead of <code>id</code> in API calls</li> <li><strong>total_tls:</strong> use upsert pattern for singleton zone setting</li> <li><strong>waiting_room_rules:</strong> use correct <code>waiting_room_id</code> field instead of <code>id</code> in API calls</li> <li><strong>workers_script:</strong> add support for placement mode/status</li> <li><strong>zero_trust_access_application:</strong> update v4 version on migration tests</li> <li><strong>zero_trust_device_posture_rule:</strong> update tests to match API</li> <li><strong>zero_trust_dlp_integration_entry:</strong> use correct <code>entry_id</code> field instead of <code>id</code> in API calls</li> <li><strong>zero_trust_dlp_predefined_entry:</strong> use correct <code>entry_id</code> field instead of <code>id</code> in API calls</li> <li><strong>zero_trust_organization:</strong> fix plan issues</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="chores">Chores</h4><a class="anchor-link" href="#chores"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>add state upgraders to 95+ resources to lay the foundation for replacing Grit (still under active development)</li> <li><strong>certificate_pack:</strong> add state migration handler for SDKv2 to Framework conversion</li> <li><strong>custom_hostname_fallback_origin:</strong> add comprehensive lifecycle test and migration support</li> <li><strong>dns_record:</strong> add state migration handler for SDKv2 to Framework conversion</li> <li><strong>leaked_credential_check:</strong> add import functionality and tests</li> <li><strong>load_balancer_pool:</strong> add state migration handler with detection for v4 vs v5 format</li> <li><strong>pages_project:</strong> add state migration handlers</li> <li><strong>tiered_cache:</strong> add state migration handlers</li> <li><strong>zero_trust_dlp_predefined_profile:</strong> deprecate <code>entries</code> field in favor of <code>enabled_entries</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">List of stabilized resources<span class="external-link"> ↗</span></a></li> </ul>Thu, 12 Feb 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Post-quantum encryption support for Cloudflare One Appliancehttps://developers.cloudflare.com/changelog/post/2026-02-11-appliance-post-quantum-encryption/https://developers.cloudflare.com/changelog/post/2026-02-11-appliance-post-quantum-encryption/<p>Cloudflare One Appliance version 2026.2.0 adds <a href="https://developers.cloudflare.com/ssl/post-quantum-cryptography/">post-quantum encryption</a> support using hybrid ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism).</p> <p>The appliance now uses TLS 1.3 with hybrid ML-KEM for its connection to the Cloudflare edge. During the TLS handshake, the appliance and the edge share a symmetric secret over the TLS connection and inject it into the ESP layer of IPsec. This protects IPsec data plane traffic against harvest-now, decrypt-later attacks.</p> <p>This upgrade deploys automatically to all appliances during their configured interrupt windows with no manual action required.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/">Cloudflare One Appliance</a>.</p>Wed, 11 Feb 2026 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANWorkers - Workers are no longer limited to 1000 subrequestshttps://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/https://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/ <p>Workers no longer have a limit of 1000 subrequests per invocation, allowing you to make more <code>fetch()</code> calls or requests to Cloudflare services on every incoming request. This is especially important for long-running Workers requests, such as open websockets on <a href="https://developers.cloudflare.com/durable-objects">Durable Objects</a> or long-running <a href="https://developers.cloudflare.com/workflows">Workflows</a>, as these could often exceed this limit and error.</p> <p>By default, Workers on paid plans are now limited to 10,000 subrequests per invocation, but this limit can be increased up to 10 million by setting the new <code>subrequests</code> limit in your Wrangler configuration file.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "limits"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "subrequests"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">50000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">limits</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">subrequests = </span><span class="nb-shiki-dzsirb">50_000</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Workers on the free plan remain limited to 50 external subrequests and 1000 subrequests to Cloudflare services per invocation.</p> <p>To protect against runaway code or unexpected costs, you can also set a lower limit for both subrequests and CPU usage.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "limits"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "subrequests"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">10</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cpu_ms"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">limits</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">subrequests = </span><span class="nb-shiki-dzsirb">10</span></span> <span class="line"><span class="nb-shiki-140thh">cpu_ms = </span><span class="nb-shiki-dzsirb">1_000</span></span></code></pre></figure></div></div></div> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#limits">Wrangler configuration documentation for limits</a> and <a href="https://developers.cloudflare.com/workers/platform/limits/#subrequests">subrequest limits</a>.</p>Wed, 11 Feb 2026 00:00:00 GMTWorkersWorkersWorkers - Improved React Server Components support in the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/https://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/<p>The Cloudflare Vite plugin now integrates seamlessly <a href="https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc" target="_blank" rel="noopener">@vitejs/plugin-rsc<span class="external-link"> ↗</span></a>, the official Vite plugin for <a href="https://react.dev/reference/rsc/server-components" target="_blank" rel="noopener">React Server Components<span class="external-link"> ↗</span></a>.</p> <p>A <code>childEnvironments</code> option has been added to the plugin config to enable using multiple environments within a single Worker. The parent environment can then import modules from a child environment in order to access a separate module graph. For a typical RSC use case, the plugin might be configured as in the following example:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> viteEnvironment: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"rsc"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> childEnvironments: [</span><span class="nb-shiki-mdbnqw">"ssr"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p><code>@vitejs/plugin-rsc</code> provides the lower level functionality that frameworks, such as <a href="https://reactrouter.com/how-to/react-server-components" target="_blank" rel="noopener">React Router<span class="external-link"> ↗</span></a>, build upon. The GitHub repository includes a <a href="https://github.com/vitejs/vite-plugin-react/tree/f066114c3e6bf18f5209ff3d3ef6bf1ab46d3866/packages/plugin-rsc/examples/starter-cf-single" target="_blank" rel="noopener">basic Cloudflare example<span class="external-link"> ↗</span></a>.</p>Wed, 11 Feb 2026 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2026-02-10https://developers.cloudflare.com/changelog/post/2026-02-10-waf-release/https://developers.cloudflare.com/changelog/post/2026-02-10-waf-release/ <p>This week’s release changes the rule action from BLOCK to Disabled for Anomaly:Header:User-Agent - Fake Google Bot.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ce11be543594412bb4bb92516aa0bef8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6aa0bef8</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Anomaly:Header:User-Agent - Fake Google Bot</td><td>Enabled</td><td>Disabled</td><td>We are changing the action for this rule from BLOCK to Disabled</td></tr></tbody></table>Tue, 10 Feb 2026 00:00:00 GMTWAFWAFAgents, Workers - Agents SDK v0.4.0: Readonly connections, MCP security improvements, x402 v2 migration, and custom MCP OAuth providershttps://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v0.4.0/https://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v0.4.0/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> brings readonly connections, MCP protocol and security improvements, x402 payment protocol v2 migration, and the ability to customize OAuth for MCP server connections.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="readonly-connections">Readonly connections</h4><a class="anchor-link" href="#readonly-connections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agents can now restrict WebSocket clients to read-only access, preventing them from modifying agent state. This is useful for dashboards, spectator views, or any scenario where clients should observe but not mutate.</p> <p>New hooks: <code>shouldConnectionBeReadonly</code>, <code>setConnectionReadonly</code>, <code>isConnectionReadonly</code>. Readonly connections block both client-side <code>setState()</code> and mutating <code>@callable()</code> methods, and the readonly flag survives hibernation.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldConnectionBeReadonly</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">connection</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Make spectators readonly</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> connection.url.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"spectator"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> shouldConnectionBeReadonly</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">connection</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Make spectators readonly</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> connection.url.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"spectator"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="custom-mcp-oauth-providers">Custom MCP OAuth providers</h4><a class="anchor-link" href="#custom-mcp-oauth-providers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>createMcpOAuthProvider</code> method on the <code>Agent</code> class allows subclasses to override the default OAuth provider used when connecting to MCP servers. This enables custom authentication strategies such as pre-registered client credentials or mTLS, beyond the built-in dynamic client registration.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> createMcpOAuthProvider</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">callbackUrl</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> MyCustomOAuthProvider</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.storage, </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.name, callbackUrl);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> createMcpOAuthProvider</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">callbackUrl</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> AgentMcpOAuthProvider</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> MyCustomOAuthProvider</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.ctx.storage, </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.name, callbackUrl);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-sdk-upgrade-to-1260">MCP SDK upgrade to 1.26.0</h4><a class="anchor-link" href="#mcp-sdk-upgrade-to-1260"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Upgraded the MCP SDK to 1.26.0 to prevent cross-client response leakage. Stateless MCP Servers should now create a new <code>McpServer</code> instance per request instead of sharing a single instance. A guard is added in this version of the MCP SDK which will prevent connection to a Server instance that has already been connected to a transport. Developers will need to modify their code if they declare their <code>McpServer</code> instance as a global variable.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-oauth-callback-url-security-fix">MCP OAuth callback URL security fix</h4><a class="anchor-link" href="#mcp-oauth-callback-url-security-fix"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Added <code>callbackPath</code> option to <code>addMcpServer</code> to prevent instance name leakage in MCP OAuth callback URLs. When <code>sendIdentityOnConnect</code> is <code>false</code>, <code>callbackPath</code> is now required — the default callback URL would expose the instance name, undermining the security intent. Also fixes callback request detection to match via the <code>state</code> parameter instead of a loose <code>/callback</code> URL substring check, enabling custom callback paths.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecate-onstateupdate-in-favor-of-onstatechanged">Deprecate <code>onStateUpdate</code> in favor of <code>onStateChanged</code></h4><a class="anchor-link" href="#deprecate-onstateupdate-in-favor-of-onstatechanged"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>onStateChanged</code> is a drop-in rename of <code>onStateUpdate</code> (same signature, same behavior). <code>onStateUpdate</code> still works but emits a one-time console warning per class. <code>validateStateChange</code> rejections now propagate a <code>CF_AGENT_STATE_ERROR</code> message back to the client.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="x402-v2-migration">x402 v2 migration</h4><a class="anchor-link" href="#x402-v2-migration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Migrated the x402 MCP payment integration from the legacy <code>x402</code> package to <code>@x402/core</code> and <code>@x402/evm</code> v2.</p> <p><strong>Breaking changes for x402 users:</strong></p> <ul> <li>Peer dependencies changed: replace <code>x402</code> with <code>@x402/core</code> and <code>@x402/evm</code></li> <li><code>PaymentRequirements</code> type now uses v2 fields (e.g. <code>amount</code> instead of <code>maxAmountRequired</code>)</li> <li><code>X402ClientConfig.account</code> type changed from <code>viem.Account</code> to <code>ClientEvmSigner</code> (structurally compatible with <code>privateKeyToAccount()</code>)</li> </ul> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> uninstall</span><span class="nb-shiki-mdbnqw"> x402</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-mdbnqw"> @x402/core</span><span class="nb-shiki-mdbnqw"> @x402/evm</span></span></code></pre></figure> <p>Network identifiers now accept both legacy names and CAIP-2 format:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Legacy name (auto-converted)</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> network</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"base-sepolia"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// CAIP-2 format (preferred)</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> network</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"eip155:84532"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p><strong>Other x402 changes:</strong></p> <ul> <li><code>X402ClientConfig.network</code> is now optional — the client auto-selects from available payment requirements</li> <li>Server-side lazy initialization: facilitator connection is deferred until the first paid tool invocation</li> <li>Payment tokens support both v2 (<code>PAYMENT-SIGNATURE</code>) and v1 (<code>X-PAYMENT</code>) HTTP headers</li> <li>Added <code>normalizeNetwork</code> export for converting legacy network names to CAIP-2 format</li> <li>Re-exports <code>PaymentRequirements</code>, <code>PaymentRequired</code>, <code>Network</code>, <code>FacilitatorConfig</code>, and <code>ClientEvmSigner</code> from <code>agents/x402</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Fix <code>useAgent</code> and <code>AgentClient</code> crashing when using <code>basePath</code> routing</li> <li>CORS handling delegated to partyserver's native support (simpler, more reliable)</li> <li>Client-side <code>onStateUpdateError</code> callback for handling rejected state updates</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span></span></code></pre></figure>Mon, 09 Feb 2026 00:00:00 GMTAgentsAgentsWorkersAgents - Interactive browser terminals in Sandboxeshttps://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/ <p>The <a href="https://github.com/cloudflare/sandbox-sdk" target="_blank" rel="noopener">Sandbox SDK<span class="external-link"> ↗</span></a> now supports PTY (pseudo-terminal) passthrough, enabling browser-based terminal UIs to connect to sandbox shells via WebSocket.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sandboxterminalrequest"><code>sandbox.terminal(request)</code></h4><a class="anchor-link" href="#sandboxterminalrequest"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>terminal()</code> method proxies a WebSocket upgrade to the container's PTY endpoint, with output buffering for replay on reconnect.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Worker: proxy WebSocket to container terminal</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">terminal</span><span class="nb-shiki-140thh">(request, { cols: </span><span class="nb-shiki-dzsirb">80</span><span class="nb-shiki-140thh">, rows: </span><span class="nb-shiki-dzsirb">24</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Worker: proxy WebSocket to container terminal</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">terminal</span><span class="nb-shiki-140thh">(request, { cols: </span><span class="nb-shiki-dzsirb">80</span><span class="nb-shiki-140thh">, rows: </span><span class="nb-shiki-dzsirb">24</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="multiple-terminals-per-sandbox">Multiple terminals per sandbox</h4><a class="anchor-link" href="#multiple-terminals-per-sandbox"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Each session can have its own terminal with an isolated working directory and environment, so users can run separate shells side-by-side in the same container.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Multiple isolated terminals in the same sandbox</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> dev</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">getSession</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"dev"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> dev.</span><span class="nb-shiki-1t8gfj">terminal</span><span class="nb-shiki-140thh">(request);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Multiple isolated terminals in the same sandbox</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> dev</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">getSession</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"dev"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> dev.</span><span class="nb-shiki-1t8gfj">terminal</span><span class="nb-shiki-140thh">(request);</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="xtermjs-addon">xterm.js addon</h4><a class="anchor-link" href="#xtermjs-addon"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>@cloudflare/sandbox/xterm</code> export provides a <code>SandboxAddon</code> for <a href="https://xtermjs.org/" target="_blank" rel="noopener">xterm.js<span class="external-link"> ↗</span></a> with automatic reconnection (exponential backoff + jitter), buffered output replay, and resize forwarding.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { SandboxAddon } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox/xterm"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> addon</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> SandboxAddon</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getWebSocketUrl</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">sandboxId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">origin</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `${</span><span class="nb-shiki-140thh">origin</span><span class="nb-shiki-mdbnqw">}/ws/terminal?id=${</span><span class="nb-shiki-140thh">sandboxId</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStateChange</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">state</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-1t8gfj"> updateUI</span><span class="nb-shiki-140thh">(state),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-140thh">terminal.</span><span class="nb-shiki-1t8gfj">loadAddon</span><span class="nb-shiki-140thh">(addon);</span></span> <span class="line"><span class="nb-shiki-140thh">addon.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">({ sandboxId: </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { SandboxAddon } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox/xterm"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> addon</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> SandboxAddon</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> getWebSocketUrl</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">sandboxId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">origin</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `${</span><span class="nb-shiki-140thh">origin</span><span class="nb-shiki-mdbnqw">}/ws/terminal?id=${</span><span class="nb-shiki-140thh">sandboxId</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStateChange</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">state</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> updateUI</span><span class="nb-shiki-140thh">(state),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-140thh">terminal.</span><span class="nb-shiki-1t8gfj">loadAddon</span><span class="nb-shiki-140thh">(addon);</span></span> <span class="line"><span class="nb-shiki-140thh">addon.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">({ sandboxId: </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> @cloudflare/sandbox@latest</span></span></code></pre></figure>Mon, 09 Feb 2026 00:00:00 GMTAgentsAgentsAI Crawl Control - Analytics enhancementshttps://developers.cloudflare.com/changelog/post/2026-02-09-analytics-enhancements/https://developers.cloudflare.com/changelog/post/2026-02-09-analytics-enhancements/<p>AI Crawl Control metrics have been enhanced with new views, improved filtering, and better data visualization.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2256,height=1262,format=webp/_astro/ai-crawl-control-path-patterns.0xT_lucE.png" alt="AI Crawl Control path patterns" loading="lazy" decoding="async" width="2256" height="1262"> <p><strong>Path pattern grouping</strong></p> <ul> <li>In the <strong>Metrics</strong> tab &gt; <strong>Most popular paths</strong> table, use the new <strong>Patterns</strong> tab that groups requests by URI pattern (<code>/blog/*</code>, <code>/api/v1/*</code>, <code>/docs/*</code>) to identify which site areas crawlers target most. Refer to the screenshot above.</li> </ul> <p><strong>Enhanced referral analytics</strong></p> <ul> <li>Destination patterns show which site areas receive AI-driven referral traffic.</li> <li>In the <strong>Metrics</strong> tab, a new <strong>Referrals over time</strong> chart shows trends by operator or source.</li> </ul> <p><strong>Data transfer metrics</strong></p> <ul> <li>In the <strong>Metrics</strong> tab &gt; <strong>Allowed requests over time</strong> chart, toggle <strong>Bytes</strong> to show bandwidth consumption.</li> <li>In the <strong>Crawlers</strong> tab, a new <strong>Bytes Transferred</strong> column shows bandwidth per crawler.</li> </ul> <p><strong>Image exports</strong></p> <ul> <li>Export charts and tables as images for reports and presentations.</li> </ul> <p>Learn more about <a href="https://developers.cloudflare.com/ai-crawl-control/features/analyze-ai-traffic/">analyzing AI traffic</a>.</p>Mon, 09 Feb 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlAI Search - AI Search now with more granular controls over indexinghttps://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/https://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/<p>Get your content updates into <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> faster and avoid a full rescan when you do not need it.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="reindex-individual-files-without-a-full-sync">Reindex individual files without a full sync</h4><a class="anchor-link" href="#reindex-individual-files-without-a-full-sync"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Updated a file or need to retry one that errored? When you know exactly which file changed, you can now <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/syncing/#controls">reindex it directly</a> instead of rescanning your entire data source.</p> <p>Go to <strong>Overview</strong> &gt; <strong>Indexed Items</strong> and select the sync icon next to any file to reindex it immediately.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2118,height=782,format=webp/_astro/individual-file-indexing.CQgoIj85.png" alt="Sync individual files from Indexed Items" loading="lazy" decoding="async" width="2118" height="782"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="crawl-only-the-sitemap-you-need">Crawl only the sitemap you need</h4><a class="anchor-link" href="#crawl-only-the-sitemap-you-need"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>By default, AI Search crawls all sitemaps listed in your <code>robots.txt</code>, up to the <a href="https://developers.cloudflare.com/ai-search/platform/limits-pricing/#limits">maximum files per index limit</a>. If your site has multiple sitemaps but you only want to index a specific set, you can now <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/#specific-sitemap">specify a single sitemap URL</a> to limit what the crawler visits.</p> <p>For example, if your <code>robots.txt</code> lists both <code>blog-sitemap.xml</code> and <code>docs-sitemap.xml</code>, you can specify just <code>https://example.com/docs-sitemap.xml</code> to index only your documentation.</p> <p>Configure your selection anytime in <strong>Settings</strong> &gt; <strong>Parsing options</strong> &gt; <strong>Specific sitemaps</strong>, then trigger a sync to apply the changes.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1973,height=387,format=webp/_astro/specify-sitemap.pLCkwmJ-.png" alt="Specify a sitemap in Parsinh options" loading="lazy" decoding="async" width="1973" height="387"> <p>Learn more about <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/syncing/#controls">indexing controls</a> and <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/#specific-sitemap">website crawling configuration</a>.</p>Mon, 09 Feb 2026 00:00:00 GMTAI SearchAI SearchLog Explorer - Tabs and pivotshttps://developers.cloudflare.com/changelog/post/2026-02-09-tabs-and-pivots/https://developers.cloudflare.com/changelog/post/2026-02-09-tabs-and-pivots/<p>Log Explorer now supports multiple concurrent queries with the new Tabs feature. Work with multiple queries simultaneously and pivot between datasets to investigate malicious activity more effectively.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Multiple tabs:</strong> Open and switch between multiple query tabs to compare results across different datasets.</li> <li><strong>Quick filtering:</strong> Select the filter button from query results to add a value as a filter to your current query.</li> <li><strong>Pivot to new tab:</strong> Use Cmd + click on the filter button to start a new query tab with that filter applied.</li> <li><strong>Preserved progress:</strong> Your query progress is preserved on each tab if you navigate away and return.</li> </ul> <p>For more information, refer to the <a href="https://developers.cloudflare.com/log-explorer/">Log Explorer documentation</a>.</p>Mon, 09 Feb 2026 00:00:00 GMTLog ExplorerLog ExplorerR2 SQL - R2 SQL now supports approximate aggregation functionshttps://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/<p>R2 SQL now supports five approximate aggregation functions for fast analysis of large datasets. These functions trade minor precision for improved performance on high-cardinality data.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-functions">New functions</h4><a class="anchor-link" href="#new-functions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>APPROX_PERCENTILE_CONT(column, percentile)</code> — Returns the approximate value at a given percentile (0.0 to 1.0). Works on integer and decimal columns.</li> <li><code>APPROX_PERCENTILE_CONT_WITH_WEIGHT(column, weight, percentile)</code> — Weighted percentile calculation where each row contributes proportionally to its weight column value.</li> <li><code>APPROX_MEDIAN(column)</code> — Returns the approximate median. Equivalent to <code>APPROX_PERCENTILE_CONT(column, 0.5)</code>.</li> <li><code>APPROX_DISTINCT(column)</code> — Returns the approximate number of distinct values. Works on any column type.</li> <li><code>APPROX_TOP_K(column, k)</code> — Returns the <code>k</code> most frequent values with their counts as a JSON array.</li> </ul> <p>All functions support <code>WHERE</code> filters. All except <code>APPROX_TOP_K</code> support <code>GROUP BY</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Percentile analysis on revenue data</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-dzsirb"> approx_percentile_cont</span><span class="nb-shiki-140thh">(total_amount, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">25</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-dzsirb"> approx_percentile_cont</span><span class="nb-shiki-140thh">(total_amount, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-dzsirb"> approx_percentile_cont</span><span class="nb-shiki-140thh">(total_amount, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">75</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Median per department</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> department, approx_median(total_amount)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> department</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Approximate distinct customers by region</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> region, approx_distinct(customer_id)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> region</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Top 5 most frequent departments</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> approx_top_k(department, </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Combine approximate and standard aggregations</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-dzsirb"> COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-dzsirb"> AVG</span><span class="nb-shiki-140thh">(total_amount),</span></span> <span class="line"><span class="nb-shiki-dzsirb"> approx_percentile_cont</span><span class="nb-shiki-140thh">(total_amount, </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> approx_distinct(customer_id)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> region </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> 'North'</span></span></code></pre></figure> <p>For the full syntax and additional examples, refer to the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>.</p>Mon, 09 Feb 2026 00:00:00 GMTR2 SQLR2 SQLWorkers - Visualize data, share links, and create exports with the new Workers Observability dashboardhttps://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/https://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/<p>The <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/" target="_blank" rel="noopener">Workers Observability dashboard<span class="external-link"> ↗</span></a> has some major updates to make it easier to debug your application's issues and share findings with your team.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2540,height=1170,format=webp/_astro/2026-01-22-events_share_obs_wobs.BvzY4TNV.png" alt="Workers Observability dashboard showing events view with event details and share options" loading="lazy" decoding="async" width="2540" height="1170"> <p>You can now:</p> <ul> <li><strong>Create visualizations</strong> — Build charts from your Worker data directly in a Worker's Observability tab</li> <li><strong>Export data as JSON or CSV</strong> — Download logs and traces for offline analysis or to share with teammates</li> <li><strong>Share events and traces</strong> — Generate direct URLs to specific events, invocations, and traces that open standalone pages with full context</li> <li><strong>Customize table columns</strong> — Improved field picker to add, remove, and reorder columns in the events table</li> <li><strong>Expandable event details</strong> — Expand events inline to view full details without leaving the table</li> <li><strong>Keyboard shortcuts</strong> — Navigate the dashboard with hotkey support</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2596,height=1314,format=webp/_astro/2026-01-22-vis_qb_wobs.Bb5eVQNT.png" alt="Workers Observability dashboard showing a P99 CPU time visualization grouped by outcome" loading="lazy" decoding="async" width="2596" height="1314"> <p>These updates are now live in the Cloudflare dashboard, both in a Worker's Observability tab and in the account-level Observability dashboard for a unified experience. To get started, go to <strong>Workers &amp; Pages</strong> &gt; select your Worker &gt; <strong>Observability</strong>.</p>Fri, 06 Feb 2026 00:00:00 GMTWorkersWorkersAI Crawl Control - New reference documentationhttps://developers.cloudflare.com/changelog/post/2026-02-09-reference-documentation/https://developers.cloudflare.com/changelog/post/2026-02-09-reference-documentation/<p>New reference documentation is now available for AI Crawl Control:</p> <ul> <li><strong><a href="https://developers.cloudflare.com/ai-crawl-control/reference/graphql-api/">GraphQL API reference</a></strong> — Query examples for crawler requests, top paths, referral traffic, and data transfer. Includes key filters for detection IDs, user agents, and referrer domains.</li> <li><strong><a href="https://developers.cloudflare.com/ai-crawl-control/reference/bots/">Bot reference</a></strong> — Detection IDs and user agents for major AI crawlers from OpenAI, Anthropic, Google, Meta, and others.</li> <li><strong><a href="https://developers.cloudflare.com/ai-crawl-control/reference/worker-templates/">Worker templates</a></strong> — Deploy the x402 Payment-Gated Proxy to monetize crawler access or charge bots while letting humans through free.</li> </ul>Wed, 04 Feb 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlQueues - Cloudflare Queues now available on Workers Free planhttps://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/https://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/<p><a href="https://developers.cloudflare.com/queues">Cloudflare Queues</a> is now part of the Workers free plan, offering guaranteed message delivery across up to <strong>10,000 queues</strong> to either <a href="https://developers.cloudflare.com/workers">Cloudflare Workers</a> or <a href="https://developers.cloudflare.com/queues/configuration/pull-consumers">HTTP pull consumers</a>. Every Cloudflare account now includes <strong>10,000 operations per day</strong> across reads, writes, and deletes. For more details on how each operation is defined, refer to <a href="https://developers.cloudflare.com/workers/platform/pricing/#queues" target="_blank" rel="noopener">Queues pricing<span class="external-link"> ↗</span></a>.</p> <p>All features of the existing Queues functionality are available on the free plan, including unlimited <a href="https://developers.cloudflare.com/queues/event-subscriptions/">event subscriptions</a>. Note that the maximum retention period on the free tier, however, is 24 hours rather than 14 days.</p> <p>If you are new to Cloudflare Queues, follow <a href="https://developers.cloudflare.com/queues/get-started/" target="_blank" rel="noopener">this guide<span class="external-link"> ↗</span></a> or try one of our <a href="https://developers.cloudflare.com/queues/tutorials/">tutorials</a> to get started.</p>Wed, 04 Feb 2026 00:00:00 GMTQueuesQueuesWorkflows, Workers - Visualize your Workflows in the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/https://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/<p>Cloudflare Workflows now automatically generates visual diagrams from your code</p> <p>Your Workflow is parsed to provide a visual map of the Workflow structure, allowing you to:</p> <ul> <li>Understand how steps connect and execute</li> <li>Visualize loops and nested logic</li> <li>Follow branching paths for conditional logic</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1927,height=1530,format=webp/_astro/2026-02-03-workflows-diagram.BfQAnWL3.png" alt="Example diagram" loading="lazy" decoding="async" width="1927" height="1530"> <p>You can collapse loops and nested logic to see the high-level flow, or expand them to see every step.</p> <p>Workflow diagrams are available in beta for all JavaScript and TypeScript Workflows. Find your Workflows in the <a href="https://dash.cloudflare.com/?to=/:account/workers/workflows" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> to see their diagrams.</p>Wed, 04 Feb 2026 00:00:00 GMTWorkflowsWorkflowsWorkersAgents, Workflows - Agents SDK v0.3.7: Workflows integration, synchronous state, and scheduleEvery()https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/ <p>The latest release of the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> brings first-class support for <a href="https://developers.cloudflare.com/workflows/">Cloudflare Workflows</a>, synchronous state management, and new scheduling capabilities.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflare-workflows-integration">Cloudflare Workflows integration</h4><a class="anchor-link" href="#cloudflare-workflows-integration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Agents excel at real-time communication and state management. Workflows excel at durable execution. Together, they enable powerful patterns where Agents handle WebSocket connections while Workflows handle long-running tasks, retries, and human-in-the-loop flows.</p> <p>Use the new <code>AgentWorkflow</code> class to define workflows with typed access to your Agent:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { AgentWorkflow } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ProcessingWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> AgentWorkflow</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call Agent methods via RPC</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.agent.</span><span class="nb-shiki-1t8gfj">updateStatus</span><span class="nb-shiki-140thh">(event.payload.taskId, </span><span class="nb-shiki-mdbnqw">"processing"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Non-durable: progress reporting to clients</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">reportProgress</span><span class="nb-shiki-140thh">({ step: </span><span class="nb-shiki-mdbnqw">"process"</span><span class="nb-shiki-140thh">, percent: </span><span class="nb-shiki-dzsirb">0.5</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">broadcastToClients</span><span class="nb-shiki-140thh">({ type: </span><span class="nb-shiki-mdbnqw">"update"</span><span class="nb-shiki-140thh">, taskId: event.payload.taskId });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Durable via step: idempotent, won't repeat on retry</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">mergeAgentState</span><span class="nb-shiki-140thh">({ taskProgress: </span><span class="nb-shiki-dzsirb">0.5</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"process"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> processData</span><span class="nb-shiki-140thh">(event.payload.data);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">reportComplete</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> result;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { AgentWorkflow } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { AgentWorkflowEvent, AgentWorkflowStep } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/workflows"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ProcessingWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> AgentWorkflow</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">MyAgent</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">TaskParams</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> AgentWorkflowEvent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">TaskParams</span><span class="nb-shiki-140thh">&gt;, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> AgentWorkflowStep</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call Agent methods via RPC</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.agent.</span><span class="nb-shiki-1t8gfj">updateStatus</span><span class="nb-shiki-140thh">(event.payload.taskId, </span><span class="nb-shiki-mdbnqw">"processing"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Non-durable: progress reporting to clients</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">reportProgress</span><span class="nb-shiki-140thh">({ step: </span><span class="nb-shiki-mdbnqw">"process"</span><span class="nb-shiki-140thh">, percent: </span><span class="nb-shiki-dzsirb">0.5</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">broadcastToClients</span><span class="nb-shiki-140thh">({ type: </span><span class="nb-shiki-mdbnqw">"update"</span><span class="nb-shiki-140thh">, taskId: event.payload.taskId });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Durable via step: idempotent, won't repeat on retry</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">mergeAgentState</span><span class="nb-shiki-140thh">({ taskProgress: </span><span class="nb-shiki-dzsirb">0.5</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"process"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> processData</span><span class="nb-shiki-140thh">(event.payload.data);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">reportComplete</span><span class="nb-shiki-140thh">(result);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> result;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Start workflows from your Agent with <code>runWorkflow()</code> and handle lifecycle events:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> startTask</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">taskId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">data</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> instanceId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runWorkflow</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"PROCESSING_WORKFLOW"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> taskId,</span></span> <span class="line"><span class="nb-shiki-140thh"> data,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { instanceId };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowProgress</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">workflowName</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">instanceId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">progress</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">broadcast</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({ type: </span><span class="nb-shiki-mdbnqw">"progress"</span><span class="nb-shiki-140thh">, progress }));</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowComplete</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">workflowName</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">instanceId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">result</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Workflow ${</span><span class="nb-shiki-140thh">instanceId</span><span class="nb-shiki-mdbnqw">} completed`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowError</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">workflowName</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">instanceId</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Workflow ${</span><span class="nb-shiki-140thh">instanceId</span><span class="nb-shiki-mdbnqw">} failed:`</span><span class="nb-shiki-140thh">, error);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> startTask</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">taskId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">data</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> instanceId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">runWorkflow</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"PROCESSING_WORKFLOW"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> taskId,</span></span> <span class="line"><span class="nb-shiki-140thh"> data,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { instanceId };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowProgress</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workflowName</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> instanceId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> progress</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> unknown</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ) {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">broadcast</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({ type: </span><span class="nb-shiki-mdbnqw">"progress"</span><span class="nb-shiki-140thh">, progress }));</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowComplete</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workflowName</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> instanceId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> result</span><span class="nb-shiki-1itgoe">?:</span><span class="nb-shiki-dzsirb"> unknown</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Workflow ${</span><span class="nb-shiki-140thh">instanceId</span><span class="nb-shiki-mdbnqw">} completed`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onWorkflowError</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> workflowName</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> instanceId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> error</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> unknown</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Workflow ${</span><span class="nb-shiki-140thh">instanceId</span><span class="nb-shiki-mdbnqw">} failed:`</span><span class="nb-shiki-140thh">, error);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <p>Key workflow methods on your Agent:</p> <ul> <li><code>runWorkflow(workflowName, params, options?)</code> — Start a workflow with optional metadata</li> <li><code>getWorkflow(workflowId)</code> / <code>getWorkflows(criteria?)</code> — Query workflows with cursor-based pagination</li> <li><code>approveWorkflow(workflowId)</code> / <code>rejectWorkflow(workflowId)</code> — Human-in-the-loop approval flows</li> <li><code>pauseWorkflow()</code>, <code>resumeWorkflow()</code>, <code>terminateWorkflow()</code> — Workflow control</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="synchronous-setstate">Synchronous setState()</h4><a class="anchor-link" href="#synchronous-setstate"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>State updates are now synchronous with a new <code>validateStateChange()</code> validation hook:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> validateStateChange</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">oldState</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">newState</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return false to reject the change</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (newState.count </span><span class="nb-shiki-1itgoe">&#x3C;</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return modified state to transform</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-1itgoe">...</span><span class="nb-shiki-140thh">newState, lastUpdated: Date.</span><span class="nb-shiki-1t8gfj">now</span><span class="nb-shiki-140thh">() };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">State</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> validateStateChange</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">oldState</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> State</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">newState</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> State</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> State</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return false to reject the change</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (newState.count </span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return modified state to transform</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-1itgoe">...</span><span class="nb-shiki-140thh">newState, lastUpdated: Date.</span><span class="nb-shiki-1t8gfj">now</span><span class="nb-shiki-140thh">() };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="scheduleevery-for-recurring-tasks">scheduleEvery() for recurring tasks</h4><a class="anchor-link" href="#scheduleevery-for-recurring-tasks"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>scheduleEvery()</code> method enables fixed-interval recurring tasks with built-in overlap prevention:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Run every 5 minutes</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">scheduleEvery</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"syncData"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-140thh">, { source: </span><span class="nb-shiki-mdbnqw">"api"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Run every 5 minutes</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">scheduleEvery</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"syncData"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">5</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 60</span><span class="nb-shiki-1itgoe"> *</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-140thh">, { source: </span><span class="nb-shiki-mdbnqw">"api"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="callable-system-improvements">Callable system improvements</h4><a class="anchor-link" href="#callable-system-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Client-side RPC timeout</strong> — Set timeouts on callable method invocations</li> <li><strong><code>StreamingResponse.error(message)</code></strong> — Graceful stream error signaling</li> <li><strong><code>getCallableMethods()</code></strong> — Introspection API for discovering callable methods</li> <li><strong>Connection close handling</strong> — Pending calls are automatically rejected on disconnect</li> </ul> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> agent.</span><span class="nb-shiki-1t8gfj">call</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"method"</span><span class="nb-shiki-140thh">, [args], {</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-dzsirb">5000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> stream: { onChunk, onDone, onError },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> agent.</span><span class="nb-shiki-1t8gfj">call</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"method"</span><span class="nb-shiki-140thh">, [args], {</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-dzsirb">5000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> stream: { onChunk, onDone, onError },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-and-routing-enhancements">Email and routing enhancements</h4><a class="anchor-link" href="#email-and-routing-enhancements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Secure email reply routing</strong> — Email replies are now secured with HMAC-SHA256 signed headers, preventing unauthorized routing of emails to agent instances.</p> <p><strong>Routing improvements:</strong></p> <ul> <li><code>basePath</code> option to bypass default URL construction for custom routing</li> <li>Server-sent identity — Agents send <code>name</code> and <code>agent</code> type on connect</li> <li>New <code>onIdentity</code> and <code>onIdentityChange</code> callbacks on the client</li> </ul> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> basePath: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onIdentity</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">name</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">agentType</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Connected to ${</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> agent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> basePath: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onIdentity</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">name</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">agentType</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Connected to ${</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span></span></code></pre></figure> <p>For the complete Workflows API reference and patterns, see <a href="https://developers.cloudflare.com/agents/runtime/execution/run-workflows/">Run Workflows</a>.</p>Tue, 03 Feb 2026 00:00:00 GMTAgentsAgentsWorkflowsR2 - Improve Global Upload Performance with R2 Local Uploads - Now in Open Betahttps://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/https://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/<p><a href="https://developers.cloudflare.com/r2/buckets/local-uploads/">Local Uploads</a> is now available in open beta. Enable it on your <a href="https://developers.cloudflare.com/r2/">R2</a> bucket to improve upload performance when clients upload data from a different region than your bucket. With Local Uploads enabled, object data is written to storage infrastructure near the client, then asynchronously replicated to your bucket. The object is immediately accessible and remains strongly consistent throughout. Refer to <a href="https://developers.cloudflare.com/r2/how-r2-works/">How R2 works</a> for details on how data is written to your bucket.</p> <p>In our tests, we observed <strong>up to 75% reduction in Time to Last Byte (TTLB)</strong> for upload requests when Local Uploads is enabled.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1506,height=596,format=webp/_astro/local-uploads-latency.R4pUgVuI.png" alt="Local Uploads latency comparison showing p50 TTLB dropping from around 2 seconds to 500ms after enabling Local Uploads" loading="lazy" decoding="async" width="1506" height="596"> <p>This feature is ideal when:</p> <ul> <li>Your users are globally distributed</li> <li>Upload performance and reliability is critical to your application</li> <li>You want to optimize write performance without changing your bucket's primary location</li> </ul> <p>To enable Local Uploads on your bucket, find <strong>Local Uploads</strong> in your bucket settings in the <a href="https://dash.cloudflare.com/?to=/:account/r2/overview" target="_blank" rel="noopener">Cloudflare Dashboard<span class="external-link"> ↗</span></a>, or run:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> local-uploads</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">BUCKET_NAM</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>Enabling Local Uploads on a bucket is seamless: existing uploads will complete as expected and there’s no interruption to traffic. There is no additional cost to enable Local Uploads. Upload requests incur the standard <a href="https://developers.cloudflare.com/r2/pricing/">Class A operation costs</a> same as upload requests made without Local Uploads.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/r2/buckets/local-uploads/">Local Uploads</a>.</p>Tue, 03 Feb 2026 00:00:00 GMTR2R2Security Center - Threat actor identification with "also known as" aliaseshttps://developers.cloudflare.com/changelog/post/2026-02-03-threat-actor-name-mapping/https://developers.cloudflare.com/changelog/post/2026-02-03-threat-actor-name-mapping/<p>Identifying threat actors can be challenging, because naming conventions often vary across the security industry. To simplify your research, <strong>Cloudflare Threat Events</strong> now include an <strong>Also known as</strong> field, providing a list of common aliases and industry-standard names for the groups we track.</p> <p>This new field is available in both the Cloudflare dashboard and via the API. In the dashboard, you can view these aliases by expanding the event details side panel (under the <strong>Attacker</strong> field) or by adding it as a column in your configurable table view.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Easily map Cloudflare-tracked actors to the naming conventions used by other vendors without manual cross-referencing.</li> <li>Quickly identify if a detected threat actor matches a group your team is already monitoring via other intelligence feeds.</li> </ul> <p>For more information on how to access this data, refer to the <a href="https://developers.cloudflare.com/api/resources/cloudforce_one/subresources/threat_events/" target="_blank" rel="noopener">Threat Events API documentation<span class="external-link"> ↗</span></a>.</p>Tue, 03 Feb 2026 00:00:00 GMTSecurity CenterSecurity CenterEmail security - Improved Accessibility and Search for Monitoringhttps://developers.cloudflare.com/changelog/post/2026-02-02-improved-accessibility-search-for-monitoring/https://developers.cloudflare.com/changelog/post/2026-02-02-improved-accessibility-search-for-monitoring/<p>We have updated the Monitoring page to provide a more streamlined and insightful experience for administrators, improving both data visualization and dashboard accessibility.</p> <ul><li><strong>Enhanced Visual Layout</strong>: Optimized contrast and the introduction of stacked bar charts for clearer data visualization and trend analysis. <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3212,height=2344,format=webp/_astro/monitoring-bar-charts.Bi-4BuXC.png" alt="visual-example" loading="lazy" decoding="async" width="3212" height="2344"></li><li><strong>Improved Accessibility &amp; Usability</strong>: <ul> <li><strong>Widget Search</strong>: Added search functionality to multiple widgets, including Policies, Submitters, and Impersonation.</li> <li><strong>Actionable UI</strong>: All available actions are now accessible via dedicated buttons.</li> <li><strong>State Indicators</strong>: Improved UI states to clearly communicate loading, empty datasets, and error conditions. <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3178,height=664,format=webp/_astro/monitoring-buttons.DORPJvP_.png" alt="buttons-example" loading="lazy" decoding="async" width="3178" height="664"></li></ul></li><li><strong>Granular Data Breakdowns</strong>: New views for dispositions by month, malicious email details, link actions, and impersonations. <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3202,height=1486,format=webp/_astro/monitoring-monthly-dispositions.CYuI5d9y.png" alt="monthly-example" loading="lazy" decoding="async" width="3202" height="1486"></li></ul> <p>This applies to all Email Security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Mon, 02 Feb 2026 11:05:33 GMTEmail securityEmail securityWAF - WAF Release - 2026-02-02https://developers.cloudflare.com/changelog/post/2026-02-02-waf-release/https://developers.cloudflare.com/changelog/post/2026-02-02-waf-release/ <p>This week’s release introduces new detections for CVE-2025-64459 and CVE-2025-24893.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2025-64459: Django versions prior to 5.1.14, 5.2.8, and 4.2.26 are vulnerable to SQL injection via crafted dictionaries passed to QuerySet methods and the <code>Q()</code> class.</li> <li>CVE-2025-24893: XWiki allows unauthenticated remote code execution through crafted requests to the SolrSearch endpoint, affecting the entire installation.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7a47683eacce4abd870ab2c630698ff3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...30698ff3</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>XWiki - Remote Code Execution - CVE:CVE-2025-24893 2</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ad5c52f6ca334ef4a844e5e5da8ba7e6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...da8ba7e6</span></button></rule-id></td><td>N/A</td><td>Django SQLI - CVE:CVE-2025-64459</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8f0d5c98bd24460a9305a1558d667511"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8d667511</span></button></rule-id></td><td>N/A</td><td>NoSQL, MongoDB - SQLi - Comparison - 2</td><td>Block</td><td>Block</td><td>Rule metadata description refined. Detection unchanged.</td></tr></tbody></table>Mon, 02 Feb 2026 00:00:00 GMTWAFWAFKV - Reduced minimum cache TTL for Workers KV to 30 secondshttps://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/https://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/<p>The minimum <code>cacheTtl</code> parameter for Workers KV has been reduced from 60 seconds to 30 seconds. This change applies to both <code>get()</code> and <code>getWithMetadata()</code> methods.</p> <p>This reduction allows you to maintain more up-to-date cached data and have finer-grained control over cache behavior. Applications requiring faster data refresh rates can now configure cache durations as low as 30 seconds instead of the previous 60-second minimum.</p> <p>The <code>cacheTtl</code> parameter defines how long a KV result is cached at the global network location it is accessed from:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Read with custom cache TTL</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">NAMESPACE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-key"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cacheTtl: </span><span class="nb-shiki-dzsirb">30</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Cache for minimum 30 seconds (previously 60)</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// getWithMetadata also supports the reduced cache TTL</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> valueWithMetadata</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">NAMESPACE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getWithMetadata</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-key"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cacheTtl: </span><span class="nb-shiki-dzsirb">30</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Cache for minimum 30 seconds</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>The default cache TTL remains unchanged at 60 seconds. Upgrade to the latest version of Wrangler to be able to use 30 seconds <code>cacheTtl</code>.</p> <p>This change affects all KV read operations using the binding API. For more information, consult the <a href="https://developers.cloudflare.com/kv/api/read-key-value-pairs/#cachettl-parameter">Workers KV cache TTL documentation</a>.</p>Fri, 30 Jan 2026 12:00:00 GMTKVKVCloudflare WAN, Magic Transit, Cloudflare One - BGP over GRE and IPsec tunnelshttps://developers.cloudflare.com/changelog/post/2026-01-30-bgp-over-tunnels/https://developers.cloudflare.com/changelog/post/2026-01-30-bgp-over-tunnels/<p>Magic WAN and Magic Transit customers can use the Cloudflare dashboard to configure and manage BGP peering between their networks and their Magic routing table when using IPsec and GRE tunnel on-ramps (beta).</p> <p>Using BGP peering allows customers to:</p> <ul> <li>Automate the process of adding or removing networks and subnets.</li> <li>Take advantage of failure detection and session recovery features.</li> </ul> <p>With this functionality, customers can:</p> <ul> <li>Establish an eBGP session between their devices and the Magic WAN / Magic Transit service when connected via IPsec and GRE tunnel on-ramps.</li> <li>Secure the session by MD5 authentication to prevent misconfigurations.</li> <li>Exchange routes dynamically between their devices and their Magic routing table.</li> </ul> <p>For configuration details, refer to:</p> <ul> <li><a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-routes/#configure-bgp-routes">Configure BGP routes for Magic WAN</a></li> <li><a href="https://developers.cloudflare.com/magic-transit/how-to/configure-routes/#configure-bgp-routes">Configure BGP routes for Magic Transit</a></li> </ul>Fri, 30 Jan 2026 00:00:00 GMTCloudflare WANCloudflare WANMagic TransitCloudflare OneWorkers AI - Launching FLUX.2 [klein] 9B on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/https://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/<p>We have partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 9B model to Workers AI. This distilled model offers enhanced quality compared to the 4B variant, while maintaining cost-effective pricing. With a fixed 4-step inference process, Klein 9B is ideal for rapid prototyping and real-time applications where both speed and quality matter.</p> <p>Read the <a href="https://bfl.ai/blog" target="_blank" rel="noopener">BFL blog<span class="external-link"> ↗</span></a> to learn more about the model itself, or try it out yourself on our <a href="https://multi-modal.ai.cloudflare.com/" target="_blank" rel="noopener">multi modal playground<span class="external-link"> ↗</span></a>.</p> <p>Pricing documentation is available on the <a href="https://developers.cloudflare.com/workers-ai/models/flux-2-klein-9b/">model page</a> or <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing page</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai-platform-specifics">Workers AI platform specifics</h4><a class="anchor-link" href="#workers-ai-platform-specifics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The model hosted on Workers AI is optimized for speed with a <strong>fixed 4-step inference process</strong> and supports up to 4 image inputs. Since this is a distilled model, the <code>steps</code> parameter is fixed at 4 and cannot be adjusted. Like FLUX.2 [dev] and FLUX.2 [klein] 4B, this image model uses multipart form data inputs, even if you just have a prompt.</p> <p>With the REST API, the multipart form data input looks like this:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: multipart/form-data'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> 'prompt=a sunset at the alps'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> width=</span><span class="nb-shiki-dzsirb">1024</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> height=</span><span class="nb-shiki-dzsirb">1024</span></span></code></pre></figure> <p>With the Workers AI binding, you can use it as such:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"prompt"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"a sunset with a dog"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"width"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"1024"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"height"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"1024"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// FormData doesn't expose its serialized body or boundary. Passing it to a</span></span> <span class="line"><span class="nb-shiki-21nrsd">// Request (or Response) constructor serializes it and generates the Content-Type</span></span> <span class="line"><span class="nb-shiki-21nrsd">// header with the boundary, which is required for the server to parse the multipart fields.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(form);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-klein-9b"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: formStream,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: formContentType,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>The parameters you can send to the model are detailed here:</p> <details><p><summary>JSON Schema for Model</summary> <strong>Required Parameters</strong></p><ul> <li><code>prompt</code> (string) - Text description of the image to generate</li> </ul><p><strong>Optional Parameters</strong></p><ul> <li><code>input_image_0</code> (string) - Binary image</li> <li><code>input_image_1</code> (string) - Binary image</li> <li><code>input_image_2</code> (string) - Binary image</li> <li><code>input_image_3</code> (string) - Binary image</li> <li><code>guidance</code> (float) - Guidance scale for generation. Higher values follow the prompt more closely</li> <li><code>width</code> (integer) - Width of the image, default <code>1024</code> Range: 256-1920</li> <li><code>height</code> (integer) - Height of the image, default <code>768</code> Range: 256-1920</li> <li><code>seed</code> (integer) - Seed for reproducibility</li> </ul><p><strong>Note:</strong> Since this is a distilled model, the <code>steps</code> parameter is fixed at 4 and cannot be adjusted.</p></details> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="multi-reference-images">Multi-reference images</h4><a class="anchor-link" href="#multi-reference-images"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The FLUX.2 klein-9b model supports generating images based on reference images, just like FLUX.2 [dev] and FLUX.2 [klein] 4B. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generated images. You would use it with the same multipart form data structure, with the input images in binary. The model supports up to 4 input images.</p> <p>For the prompt, you can reference the images based on the index, like <code>take the subject of image 1 and style it like image 0</code> or even use natural language like <code>place the dog beside the woman</code>.</p> <p>You must name the input parameter as <code>input_image_0</code>, <code>input_image_1</code>, <code>input_image_2</code>, <code>input_image_3</code> for it to work correctly. All input images must be smaller than 512x512.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: multipart/form-data'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> 'prompt=take the subject of image 1 and style it like image 0'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> input_image_1=@/Users/johndoe/Desktop/me.png</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> width=</span><span class="nb-shiki-dzsirb">1024</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> height=</span><span class="nb-shiki-dzsirb">1024</span></span></code></pre></figure> <p>Through Workers AI Binding:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-21nrsd">//helper function to convert ReadableStream to Blob</span></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">stream</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">contentType</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Blob</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> reader</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> stream.</span><span class="nb-shiki-1t8gfj">getReader</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> chunks</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [];</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> while</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">done</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">value</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> reader.</span><span class="nb-shiki-1t8gfj">read</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (done) </span><span class="nb-shiki-1itgoe">break</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> chunks.</span><span class="nb-shiki-1t8gfj">push</span><span class="nb-shiki-140thh">(value);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">(chunks, { type: contentType });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image0.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image1.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_0'</span><span class="nb-shiki-140thh">, image_blob0)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_1'</span><span class="nb-shiki-140thh">, image_blob1)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'prompt'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'take the subject of image 1 and style it like image 0'</span><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// FormData doesn't expose its serialized body or boundary. Passing it to a</span></span> <span class="line"><span class="nb-shiki-21nrsd">// Request (or Response) constructor serializes it and generates the Content-Type</span></span> <span class="line"><span class="nb-shiki-21nrsd">// header with the boundary, which is required for the server to parse the multipart fields.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(form);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-klein-9b"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: formStream,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: formContentType</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">})</span></span></code></pre></figure>Wed, 28 Jan 2026 00:00:00 GMTWorkers AIWorkers AICloudflare One Client - WARP client for Windows (version 2026.1.89.1)https://developers.cloudflare.com/changelog/post/2026-01-27-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2026-01-27-warp-windows-beta/<p>A new Beta release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improvements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/">multi-user mode</a>. Fixed an issue where when switching from a pre-login registration to a user registration, Mobile Device Management (MDM) configuration association could be lost.</li> <li>Added a new feature to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#netbios-over-tcpip">manage NetBIOS over TCP/IP</a> functionality on the Windows client. NetBIOS over TCP/IP on the Windows client is now disabled by default and can be enabled in <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/">device profile settings</a>.</li> <li>Fixed an issue causing failure of the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion">local network exclusion</a> feature when configured with a timeout of <code>0</code>.</li> <li>Improvement for the Windows <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/client-certificate/">client certificate posture check</a> to ensure logged results are from checks that run once users log in.</li> <li>Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 27 Jan 2026 18:47:00 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2026.1.89.1)https://developers.cloudflare.com/changelog/post/2026-01-27-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2026-01-27-warp-macos-beta/<p>A new Beta release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue causing failure of the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion">local network exclusion</a> feature when configured with a timeout of <code>0</code>.</li> <li>Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.</li> </ul> Tue, 27 Jan 2026 18:46:59 GMTCloudflare One ClientCloudflare One ClientCloudflare One, Cloudflare WAN - Configure Cloudflare source IPs (beta)https://developers.cloudflare.com/changelog/post/2026-01-27-configure-cloudflare-source-ips/https://developers.cloudflare.com/changelog/post/2026-01-27-configure-cloudflare-source-ips/<p>Cloudflare source IPs are the IP addresses used by Cloudflare services (such as Load Balancing, Gateway, and Browser Isolation) when sending traffic to your private networks.</p> <p>For customers using legacy mode routing, traffic to private networks is sourced from public Cloudflare IPs, which may cause IP conflicts. For customers using Unified Routing mode (beta), traffic to private networks is sourced from dedicated, non-Internet-routable private IPv4 range to ensure:</p> <ul> <li>Symmetric routing over private network connections</li> <li>Proper firewall state preservation</li> <li>Private traffic stays on secure paths</li> </ul> <p>Key details:</p> <ul> <li><strong>IPv4</strong>: Sourced from <code>100.64.0.0/12</code> by default, configurable to any <code>/12</code> CIDR</li> <li><strong>IPv6</strong>: Sourced from <code>2606:4700:cf1:5000::/64</code> (not configurable)</li> <li><strong>Affected connectors</strong>: GRE, IPsec, CNI, WARP Connector, and WARP Client (Cloudflare Tunnel is not affected)</li> </ul> <p>Configuring Cloudflare source IPs requires Unified Routing (beta) and the <code>Cloudflare One Networks Write</code> permission.</p> <p>For configuration details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-cloudflare-source-ips/">Configure Cloudflare source IPs</a>.</p>Tue, 27 Jan 2026 00:00:00 GMTCloudflare OneCloudflare OneCloudflare WANCloudflare Fundamentals - Added Timezone preferences settingshttps://developers.cloudflare.com/changelog/post/2026-01-27-timezone-preferences/https://developers.cloudflare.com/changelog/post/2026-01-27-timezone-preferences/<p>You can now set the timezone in the Cloudflare dashboard as Coordinated Universal Time (UTC) or your browser or system's timezone.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's New</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Unless otherwise specified in the user interface, all dates and times in the Cloudflare dashboard are now displayed in the selected timezone.</p> <p>You can change the timezone setting from the user profile dropdown.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=848,height=682,format=webp/_astro/2026-01-27-set-timezone.CUmMl54E.png" alt="Timezone preference dropdown" loading="lazy" decoding="async" width="848" height="682"> <p>The page will reload to apply the new timezone setting.</p>Tue, 27 Jan 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsRules - Control request and response body buffering in Configuration Ruleshttps://developers.cloudflare.com/changelog/post/2026-01-27-body-buffering-settings/https://developers.cloudflare.com/changelog/post/2026-01-27-body-buffering-settings/<p>You can now control how Cloudflare buffers HTTP request and response bodies using two new settings in <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="request-body-buffering">Request body buffering</h4><a class="anchor-link" href="#request-body-buffering"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Controls how Cloudflare buffers HTTP request bodies before forwarding them to your origin server:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Mode</th> <th>Behavior</th> </tr> </thead> <tbody> <tr> <td><strong>Standard</strong> (default)</td> <td>Cloudflare can inspect a prefix of the request body for enabled functionality such as WAF and Bot Management.</td> </tr> <tr> <td><strong>Full</strong></td> <td>Buffers the entire request body before sending to origin.</td> </tr> <tr> <td><strong>None</strong></td> <td>No buffering — the request body streams directly to origin without inspection.</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="response-body-buffering">Response body buffering</h4><a class="anchor-link" href="#response-body-buffering"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Controls how Cloudflare buffers HTTP response bodies before forwarding them to the client:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Mode</th> <th>Behavior</th> </tr> </thead> <tbody> <tr> <td><strong>Standard</strong> (default)</td> <td>Cloudflare can inspect a prefix of the response body for enabled functionality.</td> </tr> <tr> <td><strong>None</strong></td> <td>No buffering — the response body streams directly to the client without inspection.</td> </tr> </tbody> </table></div> <aside role="note" aria-label="Caution" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-warning); --_t: var(--nb-warning-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:warning"><path fill="currentColor" d="M236.8 188.09L149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19a23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2a7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12a12 12 0 0 1 12 12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Caution</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Setting body buffering to <strong>None</strong> may break security functionality that requires body inspection, including the Web Application Firewall (WAF) and Bot Management. Ensure that any paths where you disable buffering do not require security inspection.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-example">API example</h4><a class="anchor-link" href="#api-example"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "action"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"set_config"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "action_parameters"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "request_body_buffering"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"standard"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "response_body_buffering"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"none"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a>.</p>Tue, 27 Jan 2026 00:00:00 GMTRulesRulesWAF - WAF Release - 2026-01-26https://developers.cloudflare.com/changelog/post/2026-01-26-waf-release/https://developers.cloudflare.com/changelog/post/2026-01-26-waf-release/ <p>This week’s release introduces new detections for denial-of-service attempts targeting React CVE-2026-23864 (<a href="https://www.cve.org/CVERecord?id=CVE-2026-23864" target="_blank" rel="noopener">https://www.cve.org/CVERecord?id=CVE-2026-23864<span class="external-link"> ↗</span></a>).</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2026-23864 (<a href="https://www.cve.org/CVERecord?id=CVE-2026-23864" target="_blank" rel="noopener">https://www.cve.org/CVERecord?id=CVE-2026-23864<span class="external-link"> ↗</span></a>) affects <code>react-server-dom-parcel</code>, <code>react-server-dom-turbopack</code>, and <code>react-server-dom-webpack</code> packages.</li> <li>Attackers can send crafted HTTP requests to Server Function endpoints, causing server crashes, out-of-memory exceptions, or excessive CPU usage.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="aaede80b4d414dc89c443cea61680354"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...61680354</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>React Server - DOS - CVE:CVE-2026-23864 - 1</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3e93c9faaafa447c83a525f2dcdffcf8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dcdffcf8</span></button></rule-id></td><td>N/A</td><td>React Server - DOS - CVE:CVE-2026-23864 - 2</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="930020d567684f19b05fb35b349edbc6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...349edbc6</span></button></rule-id></td><td>N/A</td><td>React Server - DOS - CVE:CVE-2026-23864 - 3</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Mon, 26 Jan 2026 00:00:00 GMTWAFWAFCloudflare Fundamentals - New 2FA Experience for Loginhttps://developers.cloudflare.com/changelog/post/2026-01-23-New-2FA-Experience/https://developers.cloudflare.com/changelog/post/2026-01-23-New-2FA-Experience/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2721,height=1820,format=webp/_astro/2026-01-23-2fa-interstitial.TXFGNSth.png" alt="Screenshot of new 2FA enrollment experience" loading="lazy" decoding="async" width="2721" height="1820"> <p>In an effort to improve overall user security, users without 2FA will be prompted upon login to enroll in email 2FA. This will improve user security posture while minimizing friction. Users without email 2FA enabled will see a prompt to secure their account with additional factors upon logging in. Enrolling in 2FA remains optional, but strongly encouraged as it is the best way to prevent account takeovers.</p> <p>We also made changes to existing 2FA screens to improve the user experience. Now we have distinct experiences for each 2FA factor type, reflective of the way that factor works.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/user-profiles/2fa/#configure-email-two-factor-authentication">Configure Email Two Factor Authentication</a></li> </ul>Fri, 23 Jan 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsPages - Increased Pages file limit to 100,000 for paid planshttps://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/https://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/<p>Paid plans can now have up to 100,000 files per Pages site, increased from the previous limit of 20,000 files.</p> <p>To enable this increased limit, set the environment variable <code>PAGES_WRANGLER_MAJOR_VERSION=4</code> in your Pages project settings.</p> <p>The Free plan remains at 20,000 files per site.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/pages/platform/limits/#files">Pages limits documentation</a>.</p>Fri, 23 Jan 2026 00:00:00 GMTPagesPagesVectorize - Vectorize indexes now support up to 10 million vectorshttps://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/https://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/<p>You can now store up to 10 million vectors in a single Vectorize index, doubling the previous limit of 5 million vectors. This enables larger-scale semantic search, recommendation systems, and retrieval-augmented generation (RAG) applications without splitting data across multiple indexes.</p> <p>Vectorize continues to support indexes with up to 1,536 dimensions per vector at 32-bit precision. Refer to the <a href="https://developers.cloudflare.com/vectorize/platform/limits/">Vectorize limits documentation</a> for complete details.</p>Fri, 23 Jan 2026 00:00:00 GMTVectorizeVectorizeCloudflare One, Access - Require Access protection for zoneshttps://developers.cloudflare.com/changelog/post/2026-01-22-deny-by-default-for-zones/https://developers.cloudflare.com/changelog/post/2026-01-22-deny-by-default-for-zones/<p>You can now require Cloudflare Access protection for all hostnames in your account. When enabled, traffic to any hostname that does not have a matching Access application is automatically blocked.</p> <p>This deny-by-default approach prevents accidental exposure of internal resources to the public Internet. If a developer deploys a new application or creates a DNS record without configuring an Access application, the traffic is blocked rather than exposed.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2160,height=738,format=webp/_astro/require-cloudflare-access-protection.BAUmTYOs.png" alt="Require Cloudflare Access protection in the dashboard" loading="lazy" decoding="async" width="2160" height="738"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Blocked by default</strong>: Traffic to all hostnames in the account is blocked unless an Access application exists for that hostname.</li> <li><strong>Explicit access required</strong>: To allow traffic, create an Access application with an Allow or Bypass policy.</li> <li><strong>Hostname exemptions</strong>: You can exempt specific hostnames from this requirement.</li> </ul> <p>To turn on this feature, refer to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/require-access-protection/">Require Access protection</a>.</p>Thu, 22 Jan 2026 00:00:00 GMTCloudflare OneCloudflare OneAccessAccess - New granular API token permissions for Cloudflare Accesshttps://developers.cloudflare.com/changelog/post/2026-01-22-granular-api-token-permissions/https://developers.cloudflare.com/changelog/post/2026-01-22-granular-api-token-permissions/<p>Three new API token permissions are available for Cloudflare Access, giving you finer-grained control when building automations and integrations:</p> <ul> <li><strong>Access: Organizations Revoke</strong> — Grants the ability to <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/#revoke-user-sessions">revoke user sessions</a> in a Zero Trust organization. Use this permission when you need a token that can terminate active sessions without broader write access to organization settings.</li> <li><strong>Access: Population Read</strong> — Grants read access to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/scim/">SCIM users and groups</a> synced from an identity provider to Cloudflare Access. Use this permission for tokens that only need to read synced user and group data.</li> <li><strong>Access: Population Write</strong> — Grants write access to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/scim/">SCIM users and groups</a> synced from an identity provider to Cloudflare Access. Use this permission for tokens that need to create or modify synced user and group data.</li> </ul> <p>These permissions are scoped at the account level and can be combined with existing Access permissions.</p> <p>For a full list of available permissions, refer to <a href="https://developers.cloudflare.com/fundamentals/api/reference/permissions/">API token permissions</a>.</p>Thu, 22 Jan 2026 00:00:00 GMTAccessAccessRules - New cryptographic functions — encode_base64() and sha256()https://developers.cloudflare.com/changelog/post/2026-01-22-sha256-base64-encode-functions/https://developers.cloudflare.com/changelog/post/2026-01-22-sha256-base64-encode-functions/<p>Cloudflare Rulesets now includes <code>encode_base64()</code> and <code>sha256()</code> functions, enabling you to generate signed request headers directly in rule expressions. These functions support common patterns like constructing a canonical string from request attributes, computing a SHA256 digest, and Base64-encoding the result.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-functions">New functions</h4><a class="anchor-link" href="#new-functions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Function</th> <th>Description</th> <th>Availability</th> </tr> </thead> <tbody> <tr> <td><code>encode_base64(input, flags)</code></td> <td>Encodes a string to Base64 format. Optional <code>flags</code> parameter: <code>u</code> for URL-safe encoding, <code>p</code> for padding (adds <code>=</code> characters to make the output length a multiple of 4, as required by some systems). By default, output is standard Base64 without padding.</td> <td>All plans (in header transform rules)</td> </tr> <tr> <td><code>sha256(input)</code></td> <td>Computes a SHA256 hash of the input string.</td> <td>Requires enablement</td> </tr> </tbody> </table></div> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>The <code>sha256()</code> function is available as an Enterprise add-on and requires a specific entitlement. Contact your account team to enable it.</p></div></div></aside> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Encode a string to Base64 format:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">encode_base64("hello world")</span></span></code></pre></figure> <p>Returns: <code>aGVsbG8gd29ybGQ</code></p> <p><strong>Encode a string to Base64 format with padding:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">encode_base64("hello world", "p")</span></span></code></pre></figure> <p>Returns: <code>aGVsbG8gd29ybGQ=</code></p> <p><strong>Perform a URL-safe Base64 encoding of a string:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">encode_base64("hello world", "u")</span></span></code></pre></figure> <p>Returns: <code>aGVsbG8gd29ybGQ</code></p> <p><strong>Compute the SHA256 hash of a secret token:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">sha256("my-token")</span></span></code></pre></figure> <p>Returns a hash that your origin can validate to authenticate requests.</p> <p><strong>Compute the SHA256 hash of a string and encode the result to Base64 format:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">encode_base64(sha256("my-token"))</span></span></code></pre></figure> <p>Combines hashing and encoding for systems that expect Base64-encoded signatures.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/functions/">Functions reference</a>.</p>Thu, 22 Jan 2026 00:00:00 GMTRulesRulesWorkers - New Placement Hints for Workershttps://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/https://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/ <p>You can now configure Workers to run close to infrastructure in legacy cloud regions to minimize latency to existing services and databases. This is most useful when your Worker makes multiple round trips.</p> <p>To <a href="https://developers.cloudflare.com/workers/configuration/placement/#configure-explicit-placement-hints">set a placement hint</a>, set the <code>placement.region</code> property in your Wrangler configuration file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "placement"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "region"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"aws:us-east-1"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">placement</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">region = </span><span class="nb-shiki-mdbnqw">"aws:us-east-1"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Placement hints support Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure region identifiers. Workers run in the <a href="https://www.cloudflare.com/network/" target="_blank" rel="noopener">Cloudflare data center<span class="external-link"> ↗</span></a> with the lowest latency to the specified cloud region.</p> <p>If your existing infrastructure is not in these cloud providers, expose it to placement probes with <code>placement.host</code> for layer 4 checks or <code>placement.hostname</code> for layer 7 checks. These probes are designed to locate single-homed infrastructure and are not suitable for anycasted or multicasted resources.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "placement"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "host"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my_database_host.com:5432"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">placement</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">host = </span><span class="nb-shiki-mdbnqw">"my_database_host.com:5432"</span></span></code></pre></figure></div></div></div><div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "placement"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "hostname"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my_api_server.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">placement</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">hostname = </span><span class="nb-shiki-mdbnqw">"my_api_server.com"</span></span></code></pre></figure></div></div></div> <p>This is an extension of <a href="https://developers.cloudflare.com/workers/configuration/placement/#enable-smart-placement">Smart Placement</a>, which automatically places your Workers closer to back-end APIs based on measured latency. When you do not know the location of your back-end APIs or have multiple back-end APIs, set <code>mode: "smart"</code>:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "placement"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mode"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"smart"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">placement</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">mode = </span><span class="nb-shiki-mdbnqw">"smart"</span></span></code></pre></figure></div></div></div>Thu, 22 Jan 2026 00:00:00 GMTWorkersWorkersAI Search - AI Search path filtering for website and R2 data sourceshttps://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now includes <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/path-filtering/">path filtering</a> for both <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/#path-filtering">website</a> and <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#path-filtering">R2</a> data sources. You can now control which content gets indexed by defining include and exclude rules for paths.</p> <p>By controlling what gets indexed, you can improve the relevance and quality of your search results. You can also use path filtering to split a single data source across multiple AI Search instances for specialized search experiences.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2346,height=1360,format=webp/_astro/path-filtering.BCH7HN-Q.png" alt="Path filtering configuration in AI Search" loading="lazy" decoding="async" width="2346" height="1360"> <p>Path filtering uses <a href="https://github.com/micromatch/micromatch" target="_blank" rel="noopener">micromatch<span class="external-link"> ↗</span></a> patterns, so you can use <code>*</code> to match within a directory and <code>**</code> to match across directories.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Use case</th> <th>Include</th> <th>Exclude</th> </tr> </thead> <tbody> <tr> <td>Index docs but skip drafts</td> <td><code>**/docs/**</code></td> <td><code>**/docs/drafts/**</code></td> </tr> <tr> <td>Keep admin pages out of results</td> <td>—</td> <td><code>**/admin/**</code></td> </tr> <tr> <td>Index only English content</td> <td><code>**/en/**</code></td> <td>—</td> </tr> </tbody> </table></div> <p>Configure path filters when creating a new instance or update them anytime from <strong>Settings</strong>. Check out <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/path-filtering/">path filtering</a> to learn more.</p>Tue, 20 Jan 2026 00:00:00 GMTAI SearchAI SearchAI Search - Create AI Search instances programmatically via REST APIhttps://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/<p>You can now create <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> instances programmatically using the <a href="https://developers.cloudflare.com/ai-search/get-started/api/">API</a>. For example, use the API to create instances for each customer in a multi-tenant application or manage AI Search alongside your other infrastructure.</p> <p>If you have created an AI Search instance via the <a href="https://developers.cloudflare.com/ai-search/get-started/dashboard/">dashboard</a> before, you already have a <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/service-api-token/">service API token</a> registered and can start creating instances programmatically right away. If not, follow the <a href="https://developers.cloudflare.com/ai-search/get-started/api/">API guide</a> to set up your first instance.</p> <p>For example, you can now create separate search instances for each language on your website:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-140thh"> lang </span><span class="nb-shiki-1itgoe">in</span><span class="nb-shiki-mdbnqw"> en</span><span class="nb-shiki-mdbnqw"> fr</span><span class="nb-shiki-mdbnqw"> es</span><span class="nb-shiki-mdbnqw"> de</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-1itgoe">do</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/ai-search/instances"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "id": "docs-'"</span><span class="nb-shiki-140thh">$lang</span><span class="nb-shiki-mdbnqw">"'",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "web-crawler",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source": "example.com",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "source_params": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "path_include": ["**/'"</span><span class="nb-shiki-140thh">$lang</span><span class="nb-shiki-mdbnqw">"'/**"]</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span> <span class="line"><span class="nb-shiki-1itgoe">done</span></span></code></pre></figure> <p>Refer to the <a href="https://developers.cloudflare.com/api/resources/ai_search/subresources/instances/methods/create/">REST API reference</a> for additional configuration options.</p>Tue, 20 Jan 2026 00:00:00 GMTAI SearchAI SearchKV - New Workers KV Dashboard UIhttps://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/https://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/<p><a href="https://developers.cloudflare.com/kv/">Workers KV</a> has an updated dashboard UI with new dashboard styling that makes it easier to navigate and see analytics and settings for a KV namespace.</p> <p>The new dashboard features a <strong>streamlined homepage</strong> for easy access to your namespaces and key operations, with consistent design with the rest of the dashboard UI updates. It also provides an <strong>improved analytics view</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3444,height=1968,format=webp/_astro/kv-dash-ui-homepage.BT5hNntj.png" alt="New KV Dashboard Homepage" loading="lazy" decoding="async" width="3444" height="1968"> <p>The updated dashboard is now available for all Workers KV users. Log in to the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Dashboard<span class="external-link"> ↗</span></a> to start exploring the new interface.</p>Tue, 20 Jan 2026 00:00:00 GMTKVKVRules - New functions for array and map operationshttps://developers.cloudflare.com/changelog/post/2026-01-20-array-map-functions/https://developers.cloudflare.com/changelog/post/2026-01-20-array-map-functions/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-functions-for-array-and-map-operations">New functions for array and map operations</h4><a class="anchor-link" href="#new-functions-for-array-and-map-operations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare Rulesets now include new functions that enable advanced expression logic for evaluating arrays and maps. These functions allow you to build rules that match against lists of values in request or response headers, enabling use cases like country-based blocking using custom headers.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-functions">New functions</h4><a class="anchor-link" href="#new-functions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Function</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>split(source, delimiter)</code></td> <td>Splits a string into an array of strings using the specified delimiter.</td> </tr> <tr> <td><code>join(array, delimiter)</code></td> <td>Joins an array of strings into a single string using the specified delimiter.</td> </tr> <tr> <td><code>has_key(map, key)</code></td> <td>Returns <code>true</code> if the specified key exists in the map.</td> </tr> <tr> <td><code>has_value(map, value)</code></td> <td>Returns <code>true</code> if the specified value exists in the map.</td> </tr> </tbody> </table></div> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-use-cases">Example use cases</h4><a class="anchor-link" href="#example-use-cases"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Check if a country code exists in a header list:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">has_value(split(http.response.headers["x-allow-country"][0], ","), ip.src.country)</span></span></code></pre></figure> <p><strong>Check if a specific header key exists:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">has_key(http.request.headers, "x-custom-header")</span></span></code></pre></figure> <p><strong>Join array values for logging or comparison:</strong></p> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">join(http.request.headers.names, ", ")</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/functions/">Functions reference</a>.</p>Tue, 20 Jan 2026 00:00:00 GMTRulesRulesCloudflare Fundamentals, SDK - Cloudflare Typescript SDK v6.0.0-beta.1 now availablehttps://developers.cloudflare.com/changelog/post/2026-01-20-cloudflare-typescript-v6.0.0-beta.1/https://developers.cloudflare.com/changelog/post/2026-01-20-cloudflare-typescript-v6.0.0-beta.1/<blockquote> <p><strong>Disclaimer:</strong> Please note that v6.0.0-beta.1 is in Beta and we are still testing it for stability.</p> </blockquote> <p>Full Changelog: <a href="https://github.com/cloudflare/cloudflare-typescript/compare/v5.2.0...v6.0.0-beta.1" target="_blank" rel="noopener">v5.2.0...v6.0.0-beta.1<span class="external-link"> ↗</span></a></p> <p>In this release, you'll see a large number of breaking changes. This is primarily due to a change in OpenAPI definitions, which our libraries are based off of, and codegen updates that we rely on to read those OpenAPI definitions and produce our SDK libraries. As the codegen is always evolving and improving, so are our code bases.</p> <p>Some breaking changes were introduced due to bug fixes, also listed below.</p> <p>Please ensure you read through the list of changes below before moving to this version - this will help you understand any down or upstream issues it may cause to your environments.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes">Breaking Changes</h4><a class="anchor-link" href="#breaking-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="addressing---parameter-requirements-changed">Addressing - Parameter Requirements Changed</h4><a class="anchor-link" href="#addressing---parameter-requirements-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>BGPPrefixCreateParams.cidr</code>: optional → <strong>required</strong></li> <li><code>PrefixCreateParams.asn</code>: <code>number | null</code> → <code>number</code></li> <li><code>PrefixCreateParams.loa_document_id</code>: required → <strong>optional</strong></li> <li><code>ServiceBindingCreateParams.cidr</code>: optional → <strong>required</strong></li> <li><code>ServiceBindingCreateParams.service_id</code>: optional → <strong>required</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-gateway">API Gateway</h4><a class="anchor-link" href="#api-gateway"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ConfigurationUpdateResponse</code> removed</li> <li><code>PublicSchema</code> → <code>OldPublicSchema</code></li> <li><code>SchemaUpload</code> → <code>UserSchemaCreateResponse</code></li> <li><code>ConfigurationUpdateParams.properties</code> removed; use <code>normalize</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudforceone---response-type-changes">CloudforceOne - Response Type Changes</h4><a class="anchor-link" href="#cloudforceone---response-type-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ThreatEventBulkCreateResponse</code>: <code>number</code> → complex object with counts and errors</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="d1-database---query-parameters">D1 Database - Query Parameters</h4><a class="anchor-link" href="#d1-database---query-parameters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>DatabaseQueryParams</code>: simple interface → union type (<code>D1SingleQuery | MultipleQueries</code>)</li> <li><code>DatabaseRawParams</code>: same change</li> <li>Supports batch queries via <code>batch</code> array</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dns-records---type-renames-21-types">DNS Records - Type Renames (21 types)</h4><a class="anchor-link" href="#dns-records---type-renames-21-types"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>All record type interfaces renamed from <code>*Record</code> to short names:</p> <ul> <li><code>RecordResponse.ARecord</code> → <code>RecordResponse.A</code></li> <li><code>RecordResponse.AAAARecord</code> → <code>RecordResponse.AAAA</code></li> <li><code>RecordResponse.CNAMERecord</code> → <code>RecordResponse.CNAME</code></li> <li><code>RecordResponse.MXRecord</code> → <code>RecordResponse.MX</code></li> <li><code>RecordResponse.NSRecord</code> → <code>RecordResponse.NS</code></li> <li><code>RecordResponse.PTRRecord</code> → <code>RecordResponse.PTR</code></li> <li><code>RecordResponse.TXTRecord</code> → <code>RecordResponse.TXT</code></li> <li><code>RecordResponse.CAARecord</code> → <code>RecordResponse.CAA</code></li> <li><code>RecordResponse.CERTRecord</code> → <code>RecordResponse.CERT</code></li> <li><code>RecordResponse.DNSKEYRecord</code> → <code>RecordResponse.DNSKEY</code></li> <li><code>RecordResponse.DSRecord</code> → <code>RecordResponse.DS</code></li> <li><code>RecordResponse.HTTPSRecord</code> → <code>RecordResponse.HTTPS</code></li> <li><code>RecordResponse.LOCRecord</code> → <code>RecordResponse.LOC</code></li> <li><code>RecordResponse.NAPTRRecord</code> → <code>RecordResponse.NAPTR</code></li> <li><code>RecordResponse.SMIMEARecord</code> → <code>RecordResponse.SMIMEA</code></li> <li><code>RecordResponse.SRVRecord</code> → <code>RecordResponse.SRV</code></li> <li><code>RecordResponse.SSHFPRecord</code> → <code>RecordResponse.SSHFP</code></li> <li><code>RecordResponse.SVCBRecord</code> → <code>RecordResponse.SVCB</code></li> <li><code>RecordResponse.TLSARecord</code> → <code>RecordResponse.TLSA</code></li> <li><code>RecordResponse.URIRecord</code> → <code>RecordResponse.URI</code></li> <li><code>RecordResponse.OpenpgpkeyRecord</code> → <code>RecordResponse.Openpgpkey</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="iam-resource-groups">IAM Resource Groups</h4><a class="anchor-link" href="#iam-resource-groups"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ResourceGroupCreateResponse.scope</code>: optional single → <strong>required array</strong></li> <li><code>ResourceGroupCreateResponse.id</code>: optional → <strong>required</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="origin-ca-certificates---parameter-requirements-changed">Origin CA Certificates - Parameter Requirements Changed</h4><a class="anchor-link" href="#origin-ca-certificates---parameter-requirements-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>OriginCACertificateCreateParams.csr</code>: optional → <strong>required</strong></li> <li><code>OriginCACertificateCreateParams.hostnames</code>: optional → <strong>required</strong></li> <li><code>OriginCACertificateCreateParams.request_type</code>: optional → <strong>required</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pages">Pages</h4><a class="anchor-link" href="#pages"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Renamed: <code>DeploymentsSinglePage</code> → <code>DeploymentListResponsesV4PagePaginationArray</code></li> <li>Domain response fields: many optional → <strong>required</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pipelines---v0-to-v1-migration">Pipelines - v0 to v1 Migration</h4><a class="anchor-link" href="#pipelines---v0-to-v1-migration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Entire v0 API deprecated; use v1 methods (<code>createV1</code>, <code>listV1</code>, etc.)</li> <li>New sub-resources: <code>Sinks</code>, <code>Streams</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="r2">R2</h4><a class="anchor-link" href="#r2"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>EventNotificationUpdateParams.rules</code>: optional → <strong>required</strong></li> <li>Super Slurper: <code>bucket</code>, <code>secret</code> now required in source params</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="radar">Radar</h4><a class="anchor-link" href="#radar"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>dataSource</code>: <code>string</code> → typed enum (23 values)</li> <li><code>eventType</code>: <code>string</code> → typed enum (6 values)</li> <li>V2 methods require <code>dimension</code> parameter (breaking signature change)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resource-sharing">Resource Sharing</h4><a class="anchor-link" href="#resource-sharing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Removed: <code>status_message</code> field from all recipient response types</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="schema-validation">Schema Validation</h4><a class="anchor-link" href="#schema-validation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Consolidated <code>SchemaCreateResponse</code>, <code>SchemaListResponse</code>, <code>SchemaEditResponse</code>, <code>SchemaGetResponse</code> → <code>PublicSchema</code></li> <li>Renamed: <code>SchemaListResponsesV4PagePaginationArray</code> → <code>PublicSchemasV4PagePaginationArray</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="spectrum">Spectrum</h4><a class="anchor-link" href="#spectrum"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Renamed union members: <code>AppListResponse.UnionMember0</code> → <code>SpectrumConfigAppConfig</code></li> <li>Renamed union members: <code>AppListResponse.UnionMember1</code> → <code>SpectrumConfigPaygoAppConfig</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers">Workers</h4><a class="anchor-link" href="#workers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Removed: <code>WorkersBindingKindTailConsumer</code> type (all occurrences)</li> <li>Renamed: <code>ScriptsSinglePage</code> → <code>ScriptListResponsesSinglePage</code></li> <li>Removed: <code>DeploymentsSinglePage</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-dlp">Zero-Trust DLP</h4><a class="anchor-link" href="#zero-trust-dlp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>datasets.create()</code>, <code>update()</code>, <code>get()</code> return types changed</li> <li><code>PredefinedGetResponse</code> union members renamed to <code>UnionMember0-5</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-tunnels">Zero-Trust Tunnels</h4><a class="anchor-link" href="#zero-trust-tunnels"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Removed: <code>CloudflaredCreateResponse</code>, <code>CloudflaredListResponse</code>, <code>CloudflaredDeleteResponse</code>, <code>CloudflaredEditResponse</code>, <code>CloudflaredGetResponse</code></li> <li>Removed: <code>CloudflaredListResponsesV4PagePaginationArray</code></li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="abuse-reports-clientabusereports">Abuse Reports (<code>client.abuseReports</code>)</h4><a class="anchor-link" href="#abuse-reports-clientabusereports"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Reports</strong>: <code>create</code>, <code>list</code>, <code>get</code></li> <li><strong>Mitigations</strong>: sub-resource for abuse mitigations</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-search-clientaisearch">AI Search (<code>client.aisearch</code>)</h4><a class="anchor-link" href="#ai-search-clientaisearch"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Instances</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>read</code>, <code>stats</code></li> <li><strong>Items</strong>: <code>list</code>, <code>get</code></li> <li><strong>Jobs</strong>: <code>create</code>, <code>list</code>, <code>get</code>, <code>logs</code></li> <li><strong>Tokens</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>read</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="connectivity-clientconnectivity">Connectivity (<code>client.connectivity</code>)</h4><a class="anchor-link" href="#connectivity-clientconnectivity"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Directory Services</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>get</code></li> <li>Supports IPv4, IPv6, dual-stack, and hostname configurations</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="organizations-clientorganizations">Organizations (<code>client.organizations</code>)</h4><a class="anchor-link" href="#organizations-clientorganizations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Organizations</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>get</code></li> <li><strong>OrganizationProfile</strong>: <code>update</code>, <code>get</code></li> <li>Hierarchical organization support with parent/child relationships</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="r2-data-catalog-clientr2datacatalog">R2 Data Catalog (<code>client.r2DataCatalog</code>)</h4><a class="anchor-link" href="#r2-data-catalog-clientr2datacatalog"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Catalog</strong>: <code>list</code>, <code>enable</code>, <code>disable</code>, <code>get</code></li> <li><strong>Credentials</strong>: <code>create</code></li> <li><strong>MaintenanceConfigs</strong>: <code>update</code>, <code>get</code></li> <li><strong>Namespaces</strong>: <code>list</code></li> <li><strong>Tables</strong>: <code>list</code>, maintenance config management</li> <li>Apache Iceberg integration</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="realtime-kit-clientrealtimekit">Realtime Kit (<code>client.realtimeKit</code>)</h4><a class="anchor-link" href="#realtime-kit-clientrealtimekit"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Apps</strong>: <code>get</code>, <code>post</code></li> <li><strong>Meetings</strong>: <code>create</code>, <code>get</code>, participant management</li> <li><strong>Livestreams</strong>: 10+ methods for streaming</li> <li><strong>Recordings</strong>: start, pause, stop, get</li> <li><strong>Sessions</strong>: transcripts, summaries, chat</li> <li><strong>Webhooks</strong>: full CRUD</li> <li><strong>ActiveSession</strong>: polls, kick participants</li> <li><strong>Analytics</strong>: organization analytics</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="token-validation-clienttokenvalidation">Token Validation (<code>client.tokenValidation</code>)</h4><a class="anchor-link" href="#token-validation-clienttokenvalidation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Configuration</strong>: <code>create</code>, <code>list</code>, <code>delete</code>, <code>edit</code>, <code>get</code></li> <li><strong>Credentials</strong>: <code>update</code></li> <li><strong>Rules</strong>: <code>create</code>, <code>list</code>, <code>delete</code>, <code>bulkCreate</code>, <code>bulkEdit</code>, <code>edit</code>, <code>get</code></li> <li>JWT validation with RS256/384/512, PS256/384/512, ES256, ES384</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="alerting-silences-clientalertingsilences">Alerting Silences (<code>client.alerting.silences</code>)</h4><a class="anchor-link" href="#alerting-silences-clientalertingsilences"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>get</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="iam-sso-clientiamsso">IAM SSO (<code>client.iam.sso</code>)</h4><a class="anchor-link" href="#iam-sso-clientiamsso"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>get</code>, <code>beginVerification</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pipelines-v1-clientpipelines">Pipelines v1 (<code>client.pipelines</code>)</h4><a class="anchor-link" href="#pipelines-v1-clientpipelines"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Sinks</strong>: <code>create</code>, <code>list</code>, <code>delete</code>, <code>get</code></li> <li><strong>Streams</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>get</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-ai-controls--mcp-clientzerotrustaccessaicontrolsmcp">Zero-Trust AI Controls / MCP (<code>client.zeroTrust.access.aiControls.mcp</code>)</h4><a class="anchor-link" href="#zero-trust-ai-controls--mcp-clientzerotrustaccessaicontrolsmcp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Portals</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>read</code></li> <li><strong>Servers</strong>: <code>create</code>, <code>update</code>, <code>list</code>, <code>delete</code>, <code>read</code>, <code>sync</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="accounts">Accounts</h4><a class="anchor-link" href="#accounts"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>managed_by</code> field with <code>parent_org_id</code>, <code>parent_org_name</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="addressing-loa-documents">Addressing LOA Documents</h4><a class="anchor-link" href="#addressing-loa-documents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>auto_generated</code> field on <code>LOADocumentCreateResponse</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="addressing-prefixes">Addressing Prefixes</h4><a class="anchor-link" href="#addressing-prefixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>delegate_loa_creation</code>, <code>irr_validation_state</code>, <code>ownership_validation_state</code>, <code>ownership_validation_token</code>, <code>rpki_validation_state</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai">AI</h4><a class="anchor-link" href="#ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>toMarkdown.supported()</code> method to get all supported conversion formats</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-gateway">AI Gateway</h4><a class="anchor-link" href="#ai-gateway"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>zdr</code> field added to all responses and params</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="alerting">Alerting</h4><a class="anchor-link" href="#alerting"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New alert type: <code>abuse_report_alert</code></li> <li><code>type</code> field added to PolicyFilter</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="browser-rendering">Browser Rendering</h4><a class="anchor-link" href="#browser-rendering"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ContentCreateParams</code>: refined to discriminated union (<code>Variant0 | Variant1</code>)</li> <li>Split into URL-based and HTML-based parameter variants for better type safety</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="client-certificates">Client Certificates</h4><a class="anchor-link" href="#client-certificates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>reactivate</code> parameter in edit</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudforceone">CloudforceOne</h4><a class="anchor-link" href="#cloudforceone"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ThreatEventCreateParams.indicatorType</code>: required → optional</li> <li><code>hasChildren</code> field added to all threat event response types</li> <li><code>datasetIds</code> query parameter on <code>AttackerListParams</code>, <code>CategoryListParams</code>, <code>TargetIndustryListParams</code></li> <li><code>categoryUuid</code> field on <code>TagCreateResponse</code></li> <li><code>indicators</code> array for multi-indicator support per event</li> <li><code>uuid</code> and <code>preserveUuid</code> fields for UUID preservation in bulk create</li> <li><code>format</code> query parameter (<code>'json' | 'stix2'</code>) on <code>ThreatEventListParams</code></li> <li><code>createdAt</code>, <code>datasetId</code> fields on <code>ThreatEventEditParams</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="content-scanning">Content Scanning</h4><a class="anchor-link" href="#content-scanning"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>create()</code>, <code>update()</code>, <code>get()</code> methods</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="custom-pages">Custom Pages</h4><a class="anchor-link" href="#custom-pages"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New page types: <code>basic_challenge</code>, <code>under_attack</code>, <code>waf_challenge</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="d1">D1</h4><a class="anchor-link" href="#d1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>served_by_colo</code> - colo that handled query</li> <li><code>jurisdiction</code> - <code>'eu' | 'fedramp'</code></li> <li><strong>Time Travel</strong> (<code>client.d1.database.timeTravel</code>): <code>getBookmark()</code>, <code>restore()</code> - point-in-time recovery</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="email-security">Email Security</h4><a class="anchor-link" href="#email-security"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New fields on <code>InvestigateListResponse</code>/<code>InvestigateGetResponse</code>: <code>envelope_from</code>, <code>envelope_to</code>, <code>postfix_id_outbound</code>, <code>replyto</code></li> <li>New detection classification: <code>'outbound_ndr'</code></li> <li>Enhanced <code>Finding</code> interface with <code>attachment</code>, <code>detection</code>, <code>field</code>, <code>portion</code>, <code>reason</code>, <code>score</code></li> <li>Added <code>cursor</code> query parameter to <code>InvestigateListParams</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="gateway-lists">Gateway Lists</h4><a class="anchor-link" href="#gateway-lists"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New list types: <code>CATEGORY</code>, <code>LOCATION</code>, <code>DEVICE</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="intel">Intel</h4><a class="anchor-link" href="#intel"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New issue type: <code>'configuration_suggestion'</code></li> <li><code>payload</code> field: <code>unknown</code> → typed <code>Payload</code> interface with <code>detection_method</code>, <code>zone_tag</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="leaked-credential-checks">Leaked Credential Checks</h4><a class="anchor-link" href="#leaked-credential-checks"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>detections.get()</code> method</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="logpush">Logpush</h4><a class="anchor-link" href="#logpush"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New datasets: <code>dex_application_tests</code>, <code>dex_device_state_events</code>, <code>ipsec_logs</code>, <code>warp_config_changes</code>, <code>warp_toggle_changes</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="load-balancers">Load Balancers</h4><a class="anchor-link" href="#load-balancers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>Monitor.port</code>: <code>number</code> → <code>number | null</code></li> <li><code>Pool.load_shedding</code>: <code>LoadShedding</code> → <code>LoadShedding | null</code></li> <li><code>Pool.origin_steering</code>: <code>OriginSteering</code> → <code>OriginSteering | null</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="magic-transit">Magic Transit</h4><a class="anchor-link" href="#magic-transit"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>license_key</code> field on connectors</li> <li><code>provision_license</code> parameter for auto-provisioning</li> <li>IPSec: <code>custom_remote_identities</code> with FQDN support</li> <li>Snapshots: Bond interface, <code>probed_mtu</code> field</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pages-1">Pages</h4><a class="anchor-link" href="#pages-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New response types: <code>ProjectCreateResponse</code>, <code>ProjectListResponse</code>, <code>ProjectEditResponse</code>, <code>ProjectGetResponse</code></li> <li>Deployment methods return specific response types instead of generic <code>Deployment</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="queues">Queues</h4><a class="anchor-link" href="#queues"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>subscriptions.get()</code> method</li> <li>Enhanced <code>SubscriptionGetResponse</code> with typed event source interfaces</li> <li>New event source types: Images, KV, R2, Vectorize, Workers AI, Workers Builds, Workflows</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="r2-1">R2</h4><a class="anchor-link" href="#r2-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Sippy: new provider <code>s3</code> (S3-compatible endpoints)</li> <li>Sippy: <code>bucketUrl</code> field for S3-compatible sources</li> <li>Super Slurper: <code>keys</code> field on source response schemas (specify specific keys to migrate)</li> <li>Super Slurper: <code>pathPrefix</code> field on source schemas</li> <li>Super Slurper: <code>region</code> field on S3 source params</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="radar-1">Radar</h4><a class="anchor-link" href="#radar-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>geolocations.list()</code>, <code>geolocations.get()</code> methods</li> <li>Added V2 dimension-based methods (<code>summaryV2</code>, <code>timeseriesGroupsV2</code>) to radar sub-resources</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resource-sharing-1">Resource Sharing</h4><a class="anchor-link" href="#resource-sharing-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>terminal</code> boolean field to Resource Error interfaces</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rules">Rules</h4><a class="anchor-link" href="#rules"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>id</code> field to <code>ItemDeleteParams.Item</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rulesets">Rulesets</h4><a class="anchor-link" href="#rulesets"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New buffering fields on <code>SetConfigRule</code>: <code>request_body_buffering</code>, <code>response_body_buffering</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="secrets-store">Secrets Store</h4><a class="anchor-link" href="#secrets-store"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New scopes: <code>'dex'</code>, <code>'access'</code> (in addition to <code>'workers'</code>, <code>'ai_gateway'</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ssl-certificate-packs">SSL Certificate Packs</h4><a class="anchor-link" href="#ssl-certificate-packs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Response types now proper interfaces (was <code>unknown</code>)</li> <li>Fields now required: <code>id</code>, <code>certificates</code>, <code>hosts</code>, <code>status</code>, <code>type</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="security-center">Security Center</h4><a class="anchor-link" href="#security-center"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>payload</code> field: <code>unknown</code> → typed <code>Payload</code> interface with <code>detection_method</code>, <code>zone_tag</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="shared-types">Shared Types</h4><a class="anchor-link" href="#shared-types"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added: <code>CloudflareTunnelsV4PagePaginationArray</code> pagination class</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-1">Workers</h4><a class="anchor-link" href="#workers-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>subdomains.delete()</code> method</li> <li><code>Worker.references</code> - track external dependencies (domains, Durable Objects, queues)</li> <li><code>Worker.startup_time_ms</code> - startup timing</li> <li><code>Script.observability</code> - observability settings with logging</li> <li><code>Script.tag</code>, <code>Script.tags</code> - immutable ID and tags</li> <li>Placement: support for region, hostname, host-based placement</li> <li><code>tags</code>, <code>tail_consumers</code> now accept <code>| null</code></li> <li>Telemetry: <code>traces</code> field, <code>$containers</code> event info, <code>durableObjectId</code>, <code>transactionName</code>, <code>abr_level</code> fields</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-for-platforms">Workers for Platforms</h4><a class="anchor-link" href="#workers-for-platforms"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ScriptUpdateResponse</code>: new fields <code>entry_point</code>, <code>observability</code>, <code>tag</code>, <code>tags</code></li> <li><code>placement</code> field now union of 4 variants (smart mode, region, hostname, host)</li> <li><code>tags</code>, <code>tail_consumers</code> now nullable</li> <li><code>TagUpdateParams.body</code> now accepts <code>null</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workflows">Workflows</h4><a class="anchor-link" href="#workflows"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>instance_retention</code>: <code>unknown</code> → typed <code>InstanceRetention</code> interface with <code>error_retention</code>, <code>success_retention</code></li> <li>New status option: <code>'restart'</code> added to <code>StatusEditParams.status</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-devices">Zero-Trust Devices</h4><a class="anchor-link" href="#zero-trust-devices"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>External emergency disconnect settings (4 new fields)</li> <li><code>antivirus</code> device posture check type</li> <li><code>os_version_extra</code> documentation improvements</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zones">Zones</h4><a class="anchor-link" href="#zones"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New response types: <code>SubscriptionCreateResponse</code>, <code>SubscriptionUpdateResponse</code>, <code>SubscriptionGetResponse</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-access-applications">Zero-Trust Access Applications</h4><a class="anchor-link" href="#zero-trust-access-applications"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>New <code>ApplicationType</code> values: <code>'mcp'</code>, <code>'mcp_portal'</code>, <code>'proxy_endpoint'</code></li> <li>New destination type: <code>ViaMcpServerPortalDestination</code> for MCP server access</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-gateway">Zero-Trust Gateway</h4><a class="anchor-link" href="#zero-trust-gateway"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added <code>rules.listTenant()</code> method</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-gateway---proxy-endpoints">Zero-Trust Gateway - Proxy Endpoints</h4><a class="anchor-link" href="#zero-trust-gateway---proxy-endpoints"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>ProxyEndpoint</code>: interface → discriminated union (<code>ZeroTrustGatewayProxyEndpointIP | ZeroTrustGatewayProxyEndpointIdentity</code>)</li> <li><code>ProxyEndpointCreateParams</code>: interface → union type</li> <li>Added <code>kind</code> field: <code>'ip' | 'identity'</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zero-trust-tunnels-1">Zero-Trust Tunnels</h4><a class="anchor-link" href="#zero-trust-tunnels-1"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>WARPConnector*Response</code>: union type → interface</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecations">Deprecations</h4><a class="anchor-link" href="#deprecations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>API Gateway</strong>: <code>UserSchemas</code>, <code>Settings</code>, <code>SchemaValidation</code> resources</li> <li><strong>Audit Logs</strong>: <code>auditLogId.not</code> (use <code>id.not</code>)</li> <li><strong>CloudforceOne</strong>: <code>ThreatEvents.get()</code>, <code>IndicatorTypes.list()</code></li> <li><strong>Devices</strong>: <code>public_ip</code> field (use DEX API)</li> <li><strong>Email Security</strong>: <code>item_count</code> field in Move responses</li> <li><strong>Pipelines</strong>: v0 methods (use v1)</li> <li><strong>Radar</strong>: old <code>summary()</code> and <code>timeseriesGroups()</code> methods (use V2)</li> <li><strong>Rulesets</strong>: <code>disable_apps</code>, <code>mirage</code> fields</li> <li><strong>WARP Connector</strong>: <code>connections</code> field</li> <li><strong>Workers</strong>: <code>environment</code> parameter in Domains</li> <li><strong>Zones</strong>: <code>ResponseBuffering</code> page rule</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>mcp:</strong> correct code tool API endpoint (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/599703c45672dc899455d74b124018efd4b75095" target="_blank" rel="noopener">599703c<span class="external-link"> ↗</span></a>)</li> <li><strong>mcp:</strong> return correct lines on typescript errors (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/5d6f9998ed9999aaa95e1bda8cf50929f3555cf1" target="_blank" rel="noopener">5d6f999<span class="external-link"> ↗</span></a>)</li> <li><strong>organization_profile:</strong> fix bad reference (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/d84ea77094400055c06554812b84c2f0c8d00cc4" target="_blank" rel="noopener">d84ea77<span class="external-link"> ↗</span></a>)</li> <li><strong>schema_validation:</strong> correctly reflect model to openapi mapping (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/bb861516774b159d80e0f46a5f3abc5a4c9f9d49" target="_blank" rel="noopener">bb86151<span class="external-link"> ↗</span></a>)</li> <li><strong>workers:</strong> fix tests (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/2ee37f7adf5a4637d65f61fc225e135eec2579fc" target="_blank" rel="noopener">2ee37f7<span class="external-link"> ↗</span></a>)</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="documentation">Documentation</h4><a class="anchor-link" href="#documentation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Added deprecation notices with migration paths</li> <li><strong>api_gateway:</strong> deprecate API Shield Schema Validation resources (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/8a4b20f7a572422f74179fbdb4f1c4fb555e3e40" target="_blank" rel="noopener">8a4b20f<span class="external-link"> ↗</span></a>)</li> <li>Improved JSDoc examples across all resources</li> <li><strong>workers:</strong> expose subdomain delete documentation (<a href="https://github.com/cloudflare/cloudflare-typescript/commit/4f7cc1f2b8861a5b8abc193d287f78264a425062" target="_blank" rel="noopener">4f7cc1f<span class="external-link"> ↗</span></a>)</li> </ul>Tue, 20 Jan 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsSDKCloudflare Fundamentals, Terraform - Terraform v5.16.0 now availablehttps://developers.cloudflare.com/changelog/post/2026-01-20-terraform-v5.16.0-provider/https://developers.cloudflare.com/changelog/post/2026-01-20-terraform-v5.16.0-provider/<p>In January 2025, we announced the launch of the new Terraform v5 Provider. We greatly appreciate the proactive engagement and valuable feedback from the Cloudflare community following the v5 release. In response, we've established a consistent and rapid <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 week cadence<span class="external-link"> ↗</span></a> for releasing targeted improvements, demonstrating our commitment to stability and reliability.</p> <p>With the help of the community, we have a growing number of resources that we have marked as <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">stable<span class="external-link"> ↗</span></a>, with that list continuing to grow with every release. The most used <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">resources<span class="external-link"> ↗</span></a> are on track to be stable by the end of March 2026, when we will also be releasing a new migration tool to you migrate from v4 to v5 with ease.</p> <p>Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.</p> <p>This release includes bug fixes, the stabilization of even more popular resources, and more.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>custom_pages:</strong> add "waf_challenge" as new supported error page type identifier in both resource and data source schemas</li> <li><strong>list:</strong> enhance CIDR validator to check for normalized CIDR notation requiring network address for IPv4 and IPv6</li> <li><strong>magic_wan_gre_tunnel:</strong> add automatic_return_routing attribute for automatic routing control</li> <li><strong>magic_wan_gre_tunnel:</strong> add BGP configuration support with new BGP model attribute</li> <li><strong>magic_wan_gre_tunnel:</strong> add bgp_status computed attribute for BGP connection status information</li> <li><strong>magic_wan_gre_tunnel:</strong> enhance schema with BGP-related attributes and validators</li> <li><strong>magic_wan_ipsec_tunnel:</strong> add automatic_return_routing attribute for automatic routing control</li> <li><strong>magic_wan_ipsec_tunnel:</strong> add BGP configuration support with new BGP model attribute</li> <li><strong>magic_wan_ipsec_tunnel:</strong> add bgp_status computed attribute for BGP connection status information</li> <li><strong>magic_wan_ipsec_tunnel:</strong> add custom_remote_identities attribute for custom identity configuration</li> <li><strong>magic_wan_ipsec_tunnel:</strong> enhance schema with BGP and identity-related attributes</li> <li><strong>ruleset:</strong> add request body buffering support</li> <li><strong>ruleset:</strong> enhance ruleset data source with additional configuration options</li> <li><strong>workers_script:</strong> add observability logs attributes to list data source model</li> <li><strong>workers_script:</strong> enhance list data source schema with additional configuration options</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_member</strong>: fix resource importability issues</li> <li><strong>dns_record:</strong> remove unnecessary fmt.Sprintf wrapper around LoadTestCase call in test configuration helper function</li> <li><strong>load_balancer:</strong> fix session_affinity_ttl type expectations to match Float64 in initial creation and Int64 after migration</li> <li><strong>workers_kv:</strong> handle special characters correctly in URL encoding</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="documentation">Documentation</h4><a class="anchor-link" href="#documentation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_subscription:</strong> update schema description for rate_plan.sets attribute to clarify it returns an array of strings</li> <li><strong>api_shield:</strong> add resource-level description for API Shield management of auth ID characteristics</li> <li><strong>api_shield:</strong> enhance auth_id_characteristics.name attribute description to include JWT token configuration format requirements</li> <li><strong>api_shield:</strong> specify JSONPath expression format for JWT claim locations</li> <li><strong>hyperdrive_config:</strong> add description attribute to name attribute explaining its purpose in dashboard and API identification</li> <li><strong>hyperdrive_config:</strong> apply description improvements across resource, data source, and list data source schemas</li> <li><strong>hyperdrive_config:</strong> improve schema descriptions for cache settings to clarify default values</li> <li><strong>hyperdrive_config:</strong> update port description to clarify defaults for different database types</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">List of stabilized resources<span class="external-link"> ↗</span></a></li> </ul>Tue, 20 Jan 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - WAF Release - 2026-01-20https://developers.cloudflare.com/changelog/post/2026-01-20-waf-release/https://developers.cloudflare.com/changelog/post/2026-01-20-waf-release/ <p>This week's release focuses on improvements to existing detections to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against SQL injection.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a291bd530fa346d18cc1ce5a68d90c8f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...68d90c8f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>SQLi - Comment - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - Comment" (ID: <rule-id id="42c424998d2a42c9808ab49c6d8d8fe4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6d8d8fe4</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="da289f9e692e4f5397d915fbfaa045cf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...faa045cf</span></button></rule-id></td><p><td>N/A</td> <td>SQLi - Comparison - Beta</td> <td>Log</td> <td>Block</td><br> <td>This rule is merged into the original rule "SQLi - Comparison" (ID: <rule-id id="8166da327a614849bfa29317e7907480"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e7907480</span></button></rule-id>)</td></p></tr></tbody></table>Tue, 20 Jan 2026 00:00:00 GMTWAFWAFWorkers - Use auxiliary Workers alongside full-stack frameworkshttps://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/https://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/<p>Auxiliary Workers are now fully supported when using full-stack frameworks, such as <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/">React Router</a> and <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/">TanStack Start</a>, that integrate with the <a href="https://developers.cloudflare.com/workers/vite-plugin/reference/api/">Cloudflare Vite plugin</a>. They are included alongside the framework's build output in the build output directory. Note that this feature requires Vite 7 or above.</p> <p>Auxiliary Workers are additional Workers that can be called via <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/">service bindings</a> from your main (entry) Worker. They are defined in the plugin config, as in the example below:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tanstackStart } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@tanstack/react-start/plugin/vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> tanstackStart</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> viteEnvironment: { name: </span><span class="nb-shiki-mdbnqw">"ssr"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> auxiliaryWorkers: [{ configPath: </span><span class="nb-shiki-mdbnqw">"./wrangler.aux.jsonc"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>See the Vite plugin <a href="https://developers.cloudflare.com/workers/vite-plugin/reference/api/">API docs</a> for more info.</p>Tue, 20 Jan 2026 00:00:00 GMTWorkersWorkersWorkers - Import SQL files as additional modules by defaulthttps://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/https://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/<p>The <code>.sql</code> file extension is now automatically configured to be importable in your Worker code when using <a href="https://developers.cloudflare.com/workers/wrangler/bundling/#including-non-javascript-modules">Wrangler</a> or the <a href="https://developers.cloudflare.com/workers/vite-plugin/reference/non-javascript-modules/">Cloudflare Vite plugin</a>. This is particular useful for importing migrations in Durable Objects and means you no longer need to configure custom rules when using <a href="https://orm.drizzle.team/docs/connect-cloudflare-do" target="_blank" rel="noopener">Drizzle<span class="external-link"> ↗</span></a>.</p> <p>SQL files are imported as JavaScript strings:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// `example` will be a JavaScript string</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> example </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./example.sql"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure>Tue, 20 Jan 2026 00:00:00 GMTWorkersWorkersCloudflare Fundamentals - Enhanced HTTP/3 request cancellation visibilityhttps://developers.cloudflare.com/changelog/post/2026-01-19-http3-499-reporting-improvement/https://developers.cloudflare.com/changelog/post/2026-01-19-http3-499-reporting-improvement/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enhanced-http3-request-cancellation-visibility">Enhanced HTTP/3 request cancellation visibility</h4><a class="anchor-link" href="#enhanced-http3-request-cancellation-visibility"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare now provides more accurate visibility into HTTP/3 client request cancellations, giving you better insight into real client behavior and reducing unnecessary load on your origins.</p> <p>Previously, when an HTTP/3 client cancelled a request, the cancellation was not always actioned immediately. This meant requests could continue through the CDN — potentially all the way to your origin — even after the client had abandoned them. In these cases, logs would show the upstream response status (such as <code>200</code> or a timeout-related code) rather than reflecting the client cancellation.</p> <p>Now, Cloudflare terminates cancelled HTTP/3 requests immediately and accurately logs them with a <code>499</code> status code.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="better-observability-for-client-behavior">Better observability for client behavior</h4><a class="anchor-link" href="#better-observability-for-client-behavior"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When HTTP/3 clients cancel requests, Cloudflare now immediately reflects this in your logs with a <code>499</code> status code. This gives you:</p> <ul> <li><strong>More accurate traffic analysis</strong>: Understand exactly when and how often clients cancel requests.</li> <li><strong>Clearer debugging</strong>: Distinguish between true errors and intentional client cancellations.</li> <li><strong>Better availability metrics</strong>: Separate client-initiated cancellations from server-side issues.</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="reduced-origin-load">Reduced origin load</h4><a class="anchor-link" href="#reduced-origin-load"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare now terminates cancelled requests faster, which means:</p> <ul> <li><strong>Less wasted compute</strong>: Your origin no longer processes requests that clients have already abandoned.</li> <li><strong>Lower bandwidth usage</strong>: Responses are no longer generated and transmitted for cancelled requests.</li> <li><strong>Improved efficiency</strong>: Resources are freed up to handle active requests.</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-to-expect-in-your-logs">What to expect in your logs</h4><a class="anchor-link" href="#what-to-expect-in-your-logs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You may notice an increase in <code>499</code> status codes for HTTP/3 traffic. For HTTP/3, a <code>499</code> indicates the client <a href="https://datatracker.ietf.org/doc/html/rfc9114#section-4.1.1" target="_blank" rel="noopener">cancelled the request stream<span class="external-link"> ↗</span></a> before receiving a complete response — the underlying connection may remain open. This is a normal part of web traffic.</p> <p><strong>Tip</strong>: If you use <code>499</code> codes in availability calculations, consider whether client-initiated cancellations should be excluded from error rates. These typically represent normal user behavior — such as closing a browser, navigating away from a page, mobile network drops, or cancelling a download — rather than service issues.</p> <hr> <p>For more information, refer to <a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-499/">Error 499</a>.</p>Mon, 19 Jan 2026 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsMagic Transit, Cloudflare Network Firewall, Cloudflare WAN, Network Flow - Network Services navigation updatehttps://developers.cloudflare.com/changelog/post/2026-01-15-networking-navigation-update/https://developers.cloudflare.com/changelog/post/2026-01-15-networking-navigation-update/<p>The Network Services menu structure in Cloudflare's dashboard has been updated to reflect solutions and capabilities instead of product names. This will make it easier for you to find what you need and better reflects how our services work together.</p> <p>Your existing configurations will remain the same, and you will have access to all of the same features and functionality.</p> <p>The changes visible in your dashboard may vary based on the products you use. Overall, changes relate to <a href="https://developers.cloudflare.com/magic-transit/" target="_blank" rel="noopener">Magic Transit<span class="external-link"> ↗</span></a>, <a href="https://developers.cloudflare.com/magic-wan/" target="_blank" rel="noopener">Magic WAN<span class="external-link"> ↗</span></a>, and <a href="https://developers.cloudflare.com/cloudflare-network-firewall/" target="_blank" rel="noopener">Magic Firewall<span class="external-link"> ↗</span></a>.</p> <p><strong>Summary of changes:</strong></p> <ul> <li>A new <strong>Overview</strong> page provides access to the most common tasks across Magic Transit and Magic WAN.</li> <li>Product names have been removed from top-level navigation.</li> <li>Magic Transit and Magic WAN configuration is now organized under <strong>Routes</strong> and <strong>Connectors</strong>. For example, you will find IP Prefixes under <strong>Routes</strong>, and your GRE/IPsec Tunnels under <strong>Connectors.</strong></li> <li>Magic Firewall policies are now called <strong>Firewall Policies.</strong></li> <li>Magic WAN Connectors and Connector On-Ramps are now referenced in the dashboard as <strong>Appliances</strong> and <strong>Appliance profiles.</strong> They can be found under <strong>Connectors &gt; Appliances.</strong></li> <li>Network analytics, network health, and real-time analytics are now available under <strong>Insights.</strong></li> <li>Packet Captures are found under <strong>Insights &gt; Diagnostics.</strong></li> <li>You can manage your Sites from <strong>Insights &gt; Network health.</strong></li> <li>You can find Magic Network Monitoring under <strong>Insights &gt; Network flow</strong>.</li> </ul> <p>If you would like to provide feedback, complete <a href="https://forms.gle/htWyjRsTjw1usdis5" target="_blank" rel="noopener">this form<span class="external-link"> ↗</span></a>. You can also find these details in the January 7, 2026 email titled <strong>[FYI] Upcoming Network Services Dashboard Navigation Update</strong>.</p> <p>Preview: <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3000,height=1052,format=webp/_astro/networking-overview-and-navigation.CeMgEFaZ.png" alt="Networking Navigation" loading="lazy" decoding="async" width="3000" height="1052"></p>Thu, 15 Jan 2026 00:00:00 GMTMagic TransitMagic TransitCloudflare Network FirewallCloudflare WANNetwork FlowRisk Score - Support for CrowdStrike device scores in User Risk Scoringhttps://developers.cloudflare.com/changelog/post/2026-1-15-crowdstrike-score/https://developers.cloudflare.com/changelog/post/2026-1-15-crowdstrike-score/<p>Cloudflare One has expanded its [User Risk Scoring] (/cloudflare-one/insights/risk-score/) capabilities by introducing two new behaviors for organizations using the [CrowdStrike integration] (/cloudflare-one/integrations/service-providers/crowdstrike/).</p> <p>Administrators can now automatically escalate the risk score of a user if their device matches specific CrowdStrike Zero Trust Assessment (ZTA) score ranges. This allows for more granular security policies that respond dynamically to the health of the endpoint.</p> <p>New risk behaviors The following risk scoring behaviors are now available:</p> <ul> <li>CrowdStrike low device score: Automatically increases a user's risk score when the connected device reports a "Low" score from CrowdStrike.</li> <li>CrowdStrike medium device score: Automatically increases a user's risk score when the connected device reports a "Medium" score from CrowdStrike.</li> </ul> <p>These scores are derived from [CrowdStrike device posture attributes] (/cloudflare-one/integrations/service-providers/crowdstrike/#device-posture-attributes), including OS signals and sensor configurations.</p>Thu, 15 Jan 2026 00:00:00 GMTRisk ScoreRisk ScoreCloudflare Tunnel, Cloudflare Tunnel for SASE - Verify WARP Connector connectivity with a simple pinghttps://developers.cloudflare.com/changelog/post/2026-01-15-warp-connector-ping-support/https://developers.cloudflare.com/changelog/post/2026-01-15-warp-connector-ping-support/<p>We have made it easier to validate connectivity when deploying <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">WARP Connector</a> as part of your <a href="https://developers.cloudflare.com/reference-architecture/architectures/sase/#connecting-networks">software-defined private network</a>.</p> <p>You can now <code>ping</code> the WARP Connector host directly on its LAN IP address immediately after installation. This provides a fast, familiar way to confirm that the Connector is online and reachable within your network before testing access to downstream services.</p> <p>Starting with <a href="https://developers.cloudflare.com/changelog/2026-01-13-warp-linux-ga/">version 2025.10.186.0</a>, WARP Connector responds to traffic addressed to its own LAN IP, giving you immediate visibility into Connector reachability.</p> <p>Learn more about deploying <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">WARP Connector</a> and building private network connectivity with <a href="https://developers.cloudflare.com/cloudflare-one/">Cloudflare One</a>.</p>Thu, 15 Jan 2026 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEWAF - WAF Release - 2026-01-15https://developers.cloudflare.com/changelog/post/2026-01-15-waf-release/https://developers.cloudflare.com/changelog/post/2026-01-15-waf-release/ <p>This week's release focuses on improvements to existing detections to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against SQL Injection.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="eb3f44c07266448b9fa54ee7ad7dad3e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ad7dad3e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>SQLi - String Function - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - String Function" (ID: <rule-id id="63e03eecddfc4b3fb0cad587d32b798c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d32b798c</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="adf076af09b2484ca9e7881f9e553ad3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9e553ad3</span></button></rule-id></td><p><td>N/A</td> <td>SQLi - Sub Query - Beta</td> <td>Log</td> <td>Block</td><br> <td>This rule is merged into the original rule "SQLi - Sub Query" (ID: <rule-id id="6ec5ecf52c094330aff99a38743e66b1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...743e66b1</span></button></rule-id>)</td></p></tr></tbody></table>Thu, 15 Jan 2026 00:00:00 GMTWAFWAFWorkers AI - Launching FLUX.2 [klein] 4B on Workers AIhttps://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/https://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/<p>We've partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 4B model to Workers AI! This distilled model offers faster generation and cost-effective pricing, while maintaining great output quality. With a fixed 4-step inference process, Klein 4B is ideal for rapid prototyping and real-time applications where speed matters.</p> <p>Read the <a href="https://bfl.ai/blog" target="_blank" rel="noopener">BFL blog<span class="external-link"> ↗</span></a> to learn more about the model itself, or try it out yourself on our <a href="https://multi-modal.ai.cloudflare.com/" target="_blank" rel="noopener">multi modal playground<span class="external-link"> ↗</span></a>.</p> <p>Pricing documentation is available on the <a href="https://developers.cloudflare.com/workers-ai/models/flux-2-klein-4b/">model page</a> or <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing page</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai-platform-specifics">Workers AI Platform specifics</h4><a class="anchor-link" href="#workers-ai-platform-specifics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The model hosted on Workers AI is optimized for speed with a <strong>fixed 4-step inference process</strong> and supports up to 4 image inputs. Since this is a distilled model, the <code>steps</code> parameter is fixed at 4 and cannot be adjusted. Like FLUX.2 [dev], this image model uses multipart form data inputs, even if you just have a prompt.</p> <p>With the REST API, the multipart form data input looks like this:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: multipart/form-data'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> 'prompt=a sunset at the alps'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> width=</span><span class="nb-shiki-dzsirb">1024</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> height=</span><span class="nb-shiki-dzsirb">1024</span></span></code></pre></figure> <p>With the Workers AI binding, you can use it as such:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"prompt"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"a sunset with a dog"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"width"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"1024"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"height"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"1024"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// FormData doesn't expose its serialized body or boundary. Passing it to a</span></span> <span class="line"><span class="nb-shiki-21nrsd">// Request (or Response) constructor serializes it and generates the Content-Type</span></span> <span class="line"><span class="nb-shiki-21nrsd">// header with the boundary, which is required for the server to parse the multipart fields.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(form);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-klein-4b"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: formStream,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: formContentType,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>The parameters you can send to the model are detailed here:</p> <details><p><summary>JSON Schema for Model</summary> <strong>Required Parameters</strong></p><ul> <li><code>prompt</code> (string) - Text description of the image to generate</li> </ul><p><strong>Optional Parameters</strong></p><ul> <li><code>input_image_0</code> (string) - Binary image</li> <li><code>input_image_1</code> (string) - Binary image</li> <li><code>input_image_2</code> (string) - Binary image</li> <li><code>input_image_3</code> (string) - Binary image</li> <li><code>guidance</code> (float) - Guidance scale for generation. Higher values follow the prompt more closely</li> <li><code>width</code> (integer) - Width of the image, default <code>1024</code> Range: 256-1920</li> <li><code>height</code> (integer) - Height of the image, default <code>768</code> Range: 256-1920</li> <li><code>seed</code> (integer) - Seed for reproducibility</li> </ul><p><strong>Note:</strong> Since this is a distilled model, the <code>steps</code> parameter is fixed at 4 and cannot be adjusted.</p></details> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">## Multi-Reference Images</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">The FLUX.2 klein-4b model supports generating images based on reference images, just like FLUX.2 [dev]. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generated images. You would use it with the same multipart form data structure, with the input images in binary. The model supports up to 4 input images.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">For the prompt, you can reference the images based on the index, like `take the subject of image 1 and style it like image 0` or even use natural language like `place the dog beside the woman`.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">Note: you have to name the input parameter as `input_image_0`, `input_image_1`, `input_image_2`, `input_image_3` for it to work correctly. All input images must be smaller than 512x512.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">```bash</span></span> <span class="line"><span class="nb-shiki-wvjl67">curl --request POST \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --url 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --header 'Authorization: Bearer {TOKEN}' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --header 'Content-Type: multipart/form-data' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form 'prompt=take the subject of image 1 and style it like image 0' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form input_image_1=@/Users/johndoe/Desktop/me.png \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form width=1024 \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form height=1024</span></span></code></pre></figure> <p>Through Workers AI Binding:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-21nrsd">//helper function to convert ReadableStream to Blob</span></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">stream</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">contentType</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Blob</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> reader</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> stream.</span><span class="nb-shiki-1t8gfj">getReader</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> chunks</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [];</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> while</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">done</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">value</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> reader.</span><span class="nb-shiki-1t8gfj">read</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (done) </span><span class="nb-shiki-1itgoe">break</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> chunks.</span><span class="nb-shiki-1t8gfj">push</span><span class="nb-shiki-140thh">(value);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">(chunks, { type: contentType });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image0.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image1.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_0'</span><span class="nb-shiki-140thh">, image_blob0)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_1'</span><span class="nb-shiki-140thh">, image_blob1)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'prompt'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'take the subject of image 1 and style it like image 0'</span><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// FormData doesn't expose its serialized body or boundary. Passing it to a</span></span> <span class="line"><span class="nb-shiki-21nrsd">// Request (or Response) constructor serializes it and generates the Content-Type</span></span> <span class="line"><span class="nb-shiki-21nrsd">// header with the boundary, which is required for the server to parse the multipart fields.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(form);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formResponse.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-klein-4b"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: formStream,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: formContentType</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">})</span></span></code></pre></figure>Thu, 15 Jan 2026 00:00:00 GMTWorkers AIWorkers AISecurity Center - URL Scanner now supports PDF report downloadshttps://developers.cloudflare.com/changelog/post/2026-01-14-Download-URL-Scanner-Report-PDF/https://developers.cloudflare.com/changelog/post/2026-01-14-Download-URL-Scanner-Report-PDF/<p>We have expanded the reporting capabilities of the Cloudflare URL Scanner. In addition to existing JSON and HAR exports, users can now generate and download a <strong>PDF report</strong> directly from the Cloudflare dashboard. This update streamlines how security analysts can share findings with stakeholders who may not have access to the Cloudflare dashboard or specialized tools to parse JSON and HAR files.</p> <p><strong>Key Benefits:</strong></p> <ul> <li>Consolidate scan results, including screenshots, security signatures, and metadata, into a single, portable document</li> <li>Easily share professional-grade summaries with non-technical stakeholders or legal teams for faster incident response</li> </ul> <p><strong>What’s new:</strong></p> <ul> <li><strong>PDF Export Button:</strong> A new download option is available in the URL Scanner results page within the Cloudflare dashboard</li> <li><strong>Unified Documentation:</strong> Access all scan details—from high-level summaries to specific security flags—in one offline-friendly file</li> </ul> <p>To get started with the URL Scanner and explore our reporting capabilities, visit the <a href="https://developers.cloudflare.com/api/resources/url_scanner/" target="_blank" rel="noopener">URL Scanner API documentation<span class="external-link"> ↗</span></a>.</p> <hr>Wed, 14 Jan 2026 00:00:00 GMTSecurity CenterSecurity CenterCloudflare One Client - WARP client for Windows (version 2025.10.186.0)https://developers.cloudflare.com/changelog/post/2026-01-13-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2026-01-13-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features. New features include the ability to manage WARP client connectivity for all devices in your fleet using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>, and a new WARP client device posture check for <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/antivirus/">Antivirus</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Added a new feature to manage WARP client connectivity for all devices using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>. This feature allows administrators to send a global signal from an on-premises HTTPS endpoint that force disconnects or reconnects all WARP clients in an account based on configuration set on the endpoint.</li> <li>Fixed an issue that caused occasional audio degradation and increased CPU usage on Windows by optimizing route configurations for large <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/split-tunnels/#domain-based-split-tunnels">domain-based split tunnel rules</a>.</li> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">Local Domain Fallback</a> feature has been fixed for devices running WARP client version 2025.4.929.0 and newer. Previously, these devices could experience failures with Local Domain Fallback unless a fallback server was explicitly configured. This configuration is no longer a requirement for the feature to function correctly.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> now supports transparent HTTP proxying in addition to CONNECT-based proxying.</li> <li>Fixed an issue where sending large messages to the daemon by Inter-Process Communication (IPC) could cause the daemon to fail and result in service interruptions.</li> <li>Added support for a new WARP client device posture check for <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/antivirus/">Antivirus</a>. The check confirms the presence of an antivirus program on a Windows device with the option to check if the antivirus is up to date.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 13 Jan 2026 15:48:19 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.10.186.0)https://developers.cloudflare.com/changelog/post/2026-01-13-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2026-01-13-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features, including the ability to manage WARP client connectivity for all devices in your fleet using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">Local Domain Fallback</a> feature has been fixed for devices running WARP client version 2025.4.929.0 and newer. Previously, these devices could experience failures with Local Domain Fallback unless a fallback server was explicitly configured. This configuration is no longer a requirement for the feature to function correctly.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> now supports transparent HTTP proxying in addition to CONNECT-based proxying.</li> <li>Added a new feature to manage WARP client connectivity for all devices using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>. This feature allows administrators to send a global signal from an on-premises HTTPS endpoint that force disconnects or reconnects all WARP clients in an account based on configuration set on the endpoint.</li> </ul> Tue, 13 Jan 2026 15:48:17 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Linux (version 2025.10.186.0)https://developers.cloudflare.com/changelog/post/2026-01-13-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2026-01-13-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features, including the ability to manage WARP client connectivity for all devices in your fleet using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>.</p> <p>WARP client version 2025.8.779.0 introduced an updated public key for Linux packages. The public key must be updated if it was installed before September 12, 2025 to ensure the repository remains functional after December 4, 2025. Instructions to make this update are available at <a href="https://pkg.cloudflareclient.com">pkg.cloudflareclient.com</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">Local Domain Fallback</a> feature has been fixed for devices running WARP client version 2025.4.929.0 and newer. Previously, these devices could experience failures with Local Domain Fallback unless a fallback server was explicitly configured. This configuration is no longer a requirement for the feature to function correctly.</li> <li>Linux <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/disk-encryption/">disk encryption posture check</a> now supports non-filesystem encryption types like <code>dm-crypt</code>.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> now supports transparent HTTP proxying in addition to CONNECT-based proxying.</li> <li>Fixed an issue where the GUI becomes unresponsive when the <strong>Re-Authenticate in browser</strong> button is clicked.</li> <li>Added a new feature to manage WARP client connectivity for all devices using an <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect">external signal</a>. This feature allows administrators to send a global signal from an on-premises HTTPS endpoint that force disconnects or reconnects all WARP clients in an account based on configuration set on the endpoint.</li> </ul> Tue, 13 Jan 2026 01:53:14 GMTCloudflare One ClientCloudflare One ClientAI Crawl Control - AI Crawl Control Read Only role now availablehttps://developers.cloudflare.com/changelog/post/2026-01-13-ai-crawl-control-read-only-role/https://developers.cloudflare.com/changelog/post/2026-01-13-ai-crawl-control-read-only-role/<p>Account administrators can now assign the <strong>AI Crawl Control Read Only</strong> role to provide read-only access to AI Crawl Control at the domain level.</p> <p>Users with this role can view the <strong>Overview</strong>, <strong>Crawlers</strong>, <strong>Metrics</strong>, <strong>Robots.txt</strong>, and <strong>Settings</strong> tabs but cannot modify crawler actions or settings.</p> <p>This role is specific for AI Crawl Control. You still require correct permissions to access other areas / features of the dashboard.</p> <p>To assign, go to <strong>Manage Account</strong> &gt; <strong>Members</strong> and add a policy with the <strong>AI Crawl Control Read Only</strong> role scoped to the desired domain.</p>Tue, 13 Jan 2026 00:00:00 GMTAI Crawl ControlAI Crawl ControlWorkers - `wrangler types` now generates types for all environmentshttps://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/https://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/<p>The <code>wrangler types</code> command now generates TypeScript types for bindings from <strong>all environments</strong> defined in your Wrangler configuration file by default.</p> <p>Previously, <code>wrangler types</code> only generated types for bindings in the top-level configuration (or a single environment when using the <code>--env</code> flag). This meant that if you had environment-specific bindings — for example, a KV namespace only in production or an R2 bucket only in staging — those bindings would be missing from your generated types, causing TypeScript errors when accessing them.</p> <p>Now, running <code>wrangler types</code> collects bindings from all environments and includes them in the generated <code>Env</code> type. This ensures your types are complete regardless of which environment you deploy to.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="generating-types-for-a-specific-environment">Generating types for a specific environment</h4><a class="anchor-link" href="#generating-types-for-a-specific-environment"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you want the previous behavior of generating types for only a specific environment, you can use the <code>--env</code> flag:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> types</span><span class="nb-shiki-dzsirb"> --env</span><span class="nb-shiki-mdbnqw"> production</span></span></code></pre></figure> <p>Learn more about <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#types">generating types for your Worker</a> in the Wrangler documentation.</p>Tue, 13 Jan 2026 00:00:00 GMTWorkersWorkersEmail security - Enhanced visibility for post-delivery actionshttps://developers.cloudflare.com/changelog/post/2026-01-12-enhanced-visibility-post-delivery-actions/https://developers.cloudflare.com/changelog/post/2026-01-12-enhanced-visibility-post-delivery-actions/<p>The Action Log now provides enriched data for post-delivery actions to improve troubleshooting. In addition to success confirmations, failed actions now display the targeted Destination folder and a specific failure reason within the Activity field.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Error messages will vary depending on whether you are using Google Workspace or Microsoft 365.</p></div></div></aside><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2348,height=1692,format=webp/_astro/enhanced-visibility-post-delivery-actions.BNiyPtJU.png" alt="failure-log-example" loading="lazy" decoding="async" width="2348" height="1692"> <p>This update allows you to see the full lifecycle of a failed action. For instance, if an administrator tries to move an email that has already been deleted or moved manually, the log will now show the multiple retry attempts and the specific destination error.</p> <p>This applies to all Email Security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Mon, 12 Jan 2026 11:15:33 GMTEmail securityEmail securityRules - Metro code field now available in Ruleshttps://developers.cloudflare.com/changelog/post/2026-01-12-dma-metro-code-field/https://developers.cloudflare.com/changelog/post/2026-01-12-dma-metro-code-field/<p>The <code>ip.src.metro_code</code> field in the Ruleset Engine is now populated with DMA (Designated Market Area) data.</p> <p>You can use this field to build rules that target traffic based on geographic market areas, enabling more granular location-based policies for your applications.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="field-details">Field details</h4><a class="anchor-link" href="#field-details"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>ip.src.metro_code</code></td> <td>String | null</td> <td>The metro code (DMA) of the incoming request's IP address. Returns the designated market area code for the client's location.</td> </tr> </tbody> </table></div> <p>Example filter expression:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">ip.src.metro_code eq "501"</span></span></code></pre></figure> <p>For more information, refer to the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/ip.src.metro_code/">Fields reference</a>.</p>Mon, 12 Jan 2026 00:00:00 GMTRulesRulesSecurity Center - Cloudflare Threat Events now support STIX2 formathttps://developers.cloudflare.com/changelog/post/2026-01-12-STIX2-available-for-threat-events-api/https://developers.cloudflare.com/changelog/post/2026-01-12-STIX2-available-for-threat-events-api/<p>We are excited to announce that <strong>Cloudflare Threat Events</strong> now supports the <strong>STIX2 (Structured Threat Information Expression)</strong> format. This was a highly requested feature designed to streamline how security teams consume and act upon our threat intelligence.</p> <p>By adopting this industry-standard format, you can now integrate Cloudflare's threat events data more effectively into your existing security ecosystem.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-benefits">Key benefits</h4><a class="anchor-link" href="#key-benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li> <p>Eliminate the need for custom parsers, as STIX2 allows for "out of the box" ingestion into major <strong>Threat Intel Platforms (TIPs)</strong>, <strong>SIEMs</strong>, and <strong>SOAR</strong> tools.</p> </li> <li> <p>STIX2 provides a standardized way to represent relationships between indicators, sightings, and threat actors, giving your analysts a clearer picture of the threat landscape.</p> </li> </ul> <p>For technical details on how to query events using this format, please refer to our <a href="https://developers.cloudflare.com/api/resources/cloudforce_one/subresources/threat_events/methods/list/" target="_blank" rel="noopener">Threat Events API Documentation<span class="external-link"> ↗</span></a>.</p> <hr>Mon, 12 Jan 2026 00:00:00 GMTSecurity CenterSecurity CenterWAF - WAF Release - 2026-01-12https://developers.cloudflare.com/changelog/post/2026-01-12-waf-release/https://developers.cloudflare.com/changelog/post/2026-01-12-waf-release/ <p>This week's release focuses on improvements to existing detections to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against SQL Injection.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="72963b917ef74697b5bde02f48a1841a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...48a1841a</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>SQLi - AND/OR MAKE_SET/ELT - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - AND/OR MAKE_SET/ELT" (ID: <rule-id id="0f41a593c8fe42c38a26f709252d3934"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...252d3934</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="adf076af09b2484ca9e7881f9e553ad3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9e553ad3</span></button></rule-id></td><p><td>N/A</td> <td>SQLi - Benchmark Function - Beta</td> <td>Log</td> <td>Block</td><br> <td>This rule is merged into the original rule "SQLi - Benchmark Function" (ID: <rule-id id="ac4e9ebfb43a4f3998f6072d2ebc44ad"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2ebc44ad</span></button></rule-id>)</td></p></tr></tbody></table>Mon, 12 Jan 2026 00:00:00 GMTWAFWAFWorkers - Validate your generated types with `wrangler types --check`https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/<p>Wrangler now supports a <code>--check</code> flag for the <code>wrangler types</code> command. This flag validates that your generated types are up to date without writing any changes to disk.</p> <p>This is useful in CI/CD pipelines where you want to ensure that developers have regenerated their types after making changes to their Wrangler configuration. If the types are out of date, the command will exit with a non-zero status code.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> types</span><span class="nb-shiki-dzsirb"> --check</span></span></code></pre></figure> <p>If your types are up to date, the command will succeed silently. If they are out of date, you'll see an error message indicating which files need to be regenerated.</p> <p>For more information, see the <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#types">Wrangler types documentation</a>.</p>Mon, 12 Jan 2026 00:00:00 GMTWorkersWorkersWorkers, Queues - Get notified when your Workers builds succeed or failhttps://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/https://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/<p>You can now receive notifications when your Workers' builds start, succeed, fail, or get cancelled using <a href="https://developers.cloudflare.com/queues/event-subscriptions/">Event Subscriptions</a>.</p> <p><a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a> publishes events to a <a href="https://developers.cloudflare.com/queues/">Queue</a> that your Worker can read messages from, and then send notifications wherever you need — Slack, Discord, email, or any webhook endpoint.</p> <p>You can deploy <a href="https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template" target="_blank" rel="noopener">this Worker<span class="external-link"> ↗</span></a> to your own Cloudflare account to send build notifications to Slack:</p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare"></a></p> <p>The template includes:</p> <ul> <li>Build status with Preview/Live URLs for successful deployments</li> <li>Inline error messages for failed builds</li> <li>Branch, commit hash, and author name</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1700,height=1088,format=webp/_astro/builds-notifications-slack.rcRiU95L.png" alt="Slack notifications showing build events" loading="lazy" decoding="async" width="1700" height="1088"> <p>For setup instructions, refer to the <a href="https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template#readme" target="_blank" rel="noopener">template README<span class="external-link"> ↗</span></a> or the <a href="https://developers.cloudflare.com/queues/event-subscriptions/manage-event-subscriptions/">Event Subscriptions documentation</a>.</p>Fri, 09 Jan 2026 00:00:00 GMTWorkersWorkersQueuesWorkers - Shell tab completions for Wrangler CLIhttps://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/https://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/<p>Wrangler now includes built-in shell tab completion support, making it faster and easier to navigate commands without memorizing every option. Press Tab as you type to autocomplete commands, subcommands, flags, and even option values like log levels.</p> <p>Tab completions are supported for Bash, Zsh, Fish, and PowerShell.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="setup">Setup</h4><a class="anchor-link" href="#setup"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Generate the completion script for your shell and add it to your configuration file:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Bash</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> complete</span><span class="nb-shiki-mdbnqw"> bash</span><span class="nb-shiki-1itgoe"> &gt;&gt;</span><span class="nb-shiki-mdbnqw"> ~/.bashrc</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Zsh</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> complete</span><span class="nb-shiki-mdbnqw"> zsh</span><span class="nb-shiki-1itgoe"> &gt;&gt;</span><span class="nb-shiki-mdbnqw"> ~/.zshrc</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Fish</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> complete</span><span class="nb-shiki-mdbnqw"> fish</span><span class="nb-shiki-1itgoe"> &gt;&gt;</span><span class="nb-shiki-mdbnqw"> ~/.config/fish/config.fish</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># PowerShell</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> complete</span><span class="nb-shiki-mdbnqw"> powershell</span><span class="nb-shiki-1itgoe"> &gt;&gt;</span><span class="nb-shiki-140thh"> $PROFILE</span></span></code></pre></figure> <p>After adding the script, restart your terminal or source your configuration file for the changes to take effect. Then you can simply press Tab to see available completions:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> d</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">TA</span><span class="nb-shiki-140thh">B</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-21nrsd"> # completes to 'deploy', 'dev', 'd1', etc.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> kv</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">TA</span><span class="nb-shiki-140thh">B</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-21nrsd"> # shows subcommands: namespace, key, bulk</span></span></code></pre></figure> <p>Tab completions are dynamically generated from Wrangler's command registry, so they stay up-to-date as new commands and options are added. This feature is powered by <a href="https://github.com/bombshell-dev/tab/" target="_blank" rel="noopener"><code>@bomb.sh/tab</code><span class="external-link"> ↗</span></a>.</p> <p>See the <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#complete"><code>wrangler complete</code> documentation</a> for more details.</p>Fri, 09 Jan 2026 00:00:00 GMTWorkersWorkersAccess - Cloudflare admin activity logs capture creation of DNS over HTTP (DoH) usershttps://developers.cloudflare.com/changelog/post/2026-01-08-Access-audit-log-for-DoH-users/https://developers.cloudflare.com/changelog/post/2026-01-08-Access-audit-log-for-DoH-users/<p>Cloudflare <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/">admin activity logs</a> now capture each time a <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/dns/dns-over-https/">DNS over HTTP (DoH) user</a> is created.</p> <p>These logs can be viewed from the <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare One dashboard<span class="external-link"> ↗</span></a>, pulled via the <a href="https://developers.cloudflare.com/api/">Cloudflare API</a>, and exported through <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/">Logpush</a>.</p>Thu, 08 Jan 2026 00:00:00 GMTAccessAccessWorkers Analytics Engine, Workers - Workers Analytics Engine SQL now supports filtering using HAVING and LIKEhttps://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/https://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/<p>You can now use the <code>HAVING</code> clause and <code>LIKE</code> pattern matching operators in <a href="https://developers.cloudflare.com/analytics/analytics-engine/" target="_blank" rel="noopener">Workers Analytics Engine<span class="external-link"> ↗</span></a>.</p> <p>Workers Analytics Engine allows you to ingest and store high-cardinality data at scale and query your data through a simple SQL API.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="filtering-using-having">Filtering using <code>HAVING</code></h4><a class="anchor-link" href="#filtering-using-having"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>HAVING</code> clause complements the <code>WHERE</code> clause by enabling you to filter groups based on aggregate values. While <code>WHERE</code> filters rows before aggregation, <code>HAVING</code> filters groups after aggregation is complete.</p> <p>You can use <code>HAVING</code> to filter groups where the average exceeds a threshold:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span></span> <span class="line"><span class="nb-shiki-140thh"> blob1 </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> probe_name,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> avg</span><span class="nb-shiki-140thh">(double1) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> average_temp</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> temperature_readings</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> probe_name</span></span> <span class="line"><span class="nb-shiki-1itgoe">HAVING</span><span class="nb-shiki-140thh"> average_temp </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 10</span></span></code></pre></figure> <p>You can also filter groups based on aggregates such as the number of items in the group:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span></span> <span class="line"><span class="nb-shiki-140thh"> blob1 </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> probe_name,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> count</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> num_readings</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> temperature_readings</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> probe_name</span></span> <span class="line"><span class="nb-shiki-1itgoe">HAVING</span><span class="nb-shiki-140thh"> num_readings </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 100</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="pattern-matching-using-like">Pattern matching using <code>LIKE</code></h4><a class="anchor-link" href="#pattern-matching-using-like"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new pattern matching operators enable you to search for strings that match specific patterns using wildcard characters:</p> <ul> <li><code>LIKE</code> - case-sensitive pattern matching</li> <li><code>NOT LIKE</code> - case-sensitive pattern exclusion</li> <li><code>ILIKE</code> - case-insensitive pattern matching</li> <li><code>NOT ILIKE</code> - case-insensitive pattern exclusion</li> </ul> <p>Pattern matching supports two wildcard characters: <code>%</code> (matches zero or more characters) and <code>_</code> (matches exactly one character).</p> <p>You can match strings starting with a prefix:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-1itgoe"> *</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> logs</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> blob1 </span><span class="nb-shiki-1itgoe">LIKE</span><span class="nb-shiki-mdbnqw"> 'error%'</span></span></code></pre></figure> <p>You can also match file extensions (case-insensitive):</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-1itgoe"> *</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> requests</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> blob2 ILIKE </span><span class="nb-shiki-mdbnqw">'%.jpg'</span></span></code></pre></figure> <p>Another example is excluding strings containing specific text:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-1itgoe"> *</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> events</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> blob3 </span><span class="nb-shiki-1itgoe">NOT</span><span class="nb-shiki-140thh"> ILIKE </span><span class="nb-shiki-mdbnqw">'%debug%'</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ready-to-get-started">Ready to get started?</h4><a class="anchor-link" href="#ready-to-get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Learn more about the <a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/statements/#having-clause"><code>HAVING</code> clause</a> or <a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/operators/#pattern-matching-operators">pattern matching operators</a> in the Workers Analytics Engine SQL reference documentation.</p>Wed, 07 Jan 2026 00:00:00 GMTWorkers Analytics EngineWorkers Analytics EngineWorkersContainers - Custom container instance types now available for all usershttps://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/https://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/<p>Custom instance types are now enabled for all <a href="https://developers.cloudflare.com/containers">Cloudflare Containers</a> users. You can now specify specific vCPU, memory, and disk amounts, rather than being limited to pre-defined <a href="https://developers.cloudflare.com/containers/platform-details/limits/#instance-types">instance types</a>. Previously, only select Enterprise customers were able to customize their instance type.</p> <p>To use a custom instance type, specify the <code>instance_type</code> property as an object with <code>vcpu</code>, <code>memory_mib</code>, and <code>disk_mb</code> fields in your Wrangler configuration:</p> <figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">image = </span><span class="nb-shiki-mdbnqw">"./Dockerfile"</span></span> <span class="line"><span class="nb-shiki-140thh">instance_type = { vcpu = </span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">, memory_mib = </span><span class="nb-shiki-dzsirb">6144</span><span class="nb-shiki-140thh">, disk_mb = </span><span class="nb-shiki-dzsirb">12000</span><span class="nb-shiki-140thh"> }</span></span></code></pre></figure> <p>Individual limits for custom instance types are based on the <code>standard-4</code> instance type (4 vCPU, 12 GiB memory, 20 GB disk). You must allocate at least 1 vCPU for custom instance types. For workloads requiring less than 1 vCPU, use the predefined instance types like <code>lite</code> or <code>basic</code>.</p> <p>See the <a href="https://developers.cloudflare.com/containers/platform-details/limits/#custom-instance-types">limits documentation</a> for the full list of constraints on custom instance types. See the <a href="https://developers.cloudflare.com/containers/get-started/">getting started guide</a> to deploy your first Container,</p>Mon, 05 Jan 2026 00:00:00 GMTContainersContainersWorkers - Build microfrontend applications on Workershttps://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/https://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/ <p>You can now deploy microfrontends to Cloudflare, splitting a single application into smaller, independently deployable units that render as one cohesive application. This lets different teams using different frameworks develop, test, and deploy each microfrontend without coordinating releases.</p> <p>Microfrontends solve several challenges for large-scale applications:</p> <ul> <li><strong>Independent deployments</strong>: Teams deploy updates on their own schedule without redeploying the entire application</li> <li><strong>Framework flexibility</strong>: Build multi-framework applications (for example, Astro, Remix, and Next.js in one app)</li> <li><strong>Gradual migration</strong>: Migrate from a monolith to a distributed architecture incrementally</li> </ul> <p>Create a microfrontend project:</p> <p><a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare"></a></p> <p>This template automatically creates a router worker with pre-configured routing logic, and lets you configure <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/">Service bindings</a> to Workers you have already deployed to your Cloudflare account. The router Worker analyzes incoming requests, matches them against configured routes, and forwards requests to the appropriate microfrontend via service bindings. The router automatically rewrites HTML, CSS, and headers to ensure assets load correctly from each microfrontend's mount path. The router includes advanced features like preloading for faster navigation between microfrontends, smooth page transitions using the View Transitions API, and automatic path rewriting for assets, redirects, and cookies.</p> <p>Each microfrontend can be a full-framework application, a static site with Workers Static Assets, or any other Worker-based application.</p> <p>Get started with the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe" target="_blank" rel="noopener">microfrontends template<span class="external-link"> ↗</span></a>, or read the <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/microfrontends/">microfrontends documentation</a> for implementation details.</p>Thu, 01 Jan 2026 00:00:00 GMTWorkersWorkersCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Breakout traffic visibility via NetFlowhttps://developers.cloudflare.com/changelog/post/2025-12-31-connector-breakout-traffic-netflow/https://developers.cloudflare.com/changelog/post/2025-12-31-connector-breakout-traffic-netflow/<p>Magic WAN Connector now exports NetFlow data for breakout traffic to Magic Network Monitoring (MNM), providing visibility into traffic that bypasses Cloudflare's security filtering.</p> <p>This feature allows you to:</p> <ul> <li>Monitor breakout traffic statistics in the Cloudflare dashboard.</li> <li>View traffic patterns for applications configured to bypass Cloudflare.</li> <li>Maintain visibility across all traffic passing through your Magic WAN Connector.</li> </ul> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/analytics/netflow-analytics/">NetFlow statistics</a>.</p>Wed, 31 Dec 2025 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANAgents, Workers - Agents SDK v0.3.0, workers-ai-provider v3.0.0, and ai-gateway-provider v3.0.0 with AI SDK v6 supporthttps://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/https://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/<p>We've shipped a new release for the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> v0.3.0 bringing full compatibility with <a href="https://ai-sdk.dev/docs/introduction" target="_blank" rel="noopener">AI SDK v6<span class="external-link"> ↗</span></a> and introducing the unified tool pattern, dynamic tool approval, and enhanced React hooks with improved tool handling.</p> <p>This release includes improved streaming and tool support, dynamic tool approval (for "human in the loop" systems), enhanced React hooks with <code>onToolCall</code> callback, improved error handling for streaming responses, and seamless migration from v5 patterns.</p> <p>This makes it ideal for building production AI chat interfaces with Cloudflare Workers AI models, agent workflows, human-in-the-loop systems, or any application requiring reliable tool execution and approval workflows.</p> <p>Additionally, we've updated <strong>workers-ai-provider v3.0.0</strong>, the official provider for Cloudflare Workers AI models, and <strong>ai-gateway-provider v3.0.0</strong>, the provider for Cloudflare AI Gateway, to be compatible with AI SDK v6.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agents-sdk-v030">Agents SDK v0.3.0</h4><a class="anchor-link" href="#agents-sdk-v030"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="unified-tool-pattern">Unified Tool Pattern</h4><a class="anchor-link" href="#unified-tool-pattern"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>AI SDK v6 introduces a unified tool pattern where all tools are defined on the server using the <code>tool()</code> function. This replaces the previous client-side <code>AITool</code> pattern.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="server-side-tool-definition">Server-Side Tool Definition</h4><a class="anchor-link" href="#server-side-tool-definition"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Server: Define ALL tools on the server</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Server-executed tool</span></span> <span class="line"><span class="nb-shiki-140thh"> getWeather: </span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get weather for a city"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ city: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">city</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> fetchWeather</span><span class="nb-shiki-140thh">(city)</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Client-executed tool (no execute = client handles via onToolCall)</span></span> <span class="line"><span class="nb-shiki-140thh"> getLocation: </span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get user location from browser"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({})</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // No execute function</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Tool requiring approval (dynamic based on input)</span></span> <span class="line"><span class="nb-shiki-140thh"> processPayment: </span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Process a payment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ amount: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> needsApproval</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">amount</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> amount </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 100</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">amount</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> charge</span><span class="nb-shiki-140thh">(amount)</span></span> <span class="line"><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="client-side-tool-handling">Client-Side Tool Handling</h4><a class="anchor-link" href="#client-side-tool-handling"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Client: Handle client-side tools via onToolCall callback</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { useAgentChat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/ai-react"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">messages</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sendMessage</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">addToolOutput</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onToolCall</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">toolCall</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">addToolOutput</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (toolCall.toolName </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "getLocation"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> position</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">resolve</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">reject</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> navigator.geolocation.</span><span class="nb-shiki-1t8gfj">getCurrentPosition</span><span class="nb-shiki-140thh">(resolve, reject);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> addToolOutput</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCallId: toolCall.toolCallId,</span></span> <span class="line"><span class="nb-shiki-140thh"> output: {</span></span> <span class="line"><span class="nb-shiki-140thh"> lat: position.coords.latitude,</span></span> <span class="line"><span class="nb-shiki-140thh"> lng: position.coords.longitude</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p><strong>Key benefits of the unified tool pattern:</strong></p> <ul> <li><strong>Server-defined tools</strong>: All tools are defined in one place on the server</li> <li><strong>Dynamic approval</strong>: Use <code>needsApproval</code> to conditionally require user confirmation</li> <li><strong>Cleaner client code</strong>: Use <code>onToolCall</code> callback instead of managing tool configs</li> <li><strong>Type safety</strong>: Full TypeScript support with proper tool typing</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="useagentchatoptions">useAgentChat(options)</h4><a class="anchor-link" href="#useagentchatoptions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Creates a new chat interface with enhanced v6 capabilities.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Basic chat setup with onToolCall</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">messages</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sendMessage</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">addToolOutput</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onToolCall</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">toolCall</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">addToolOutput</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Handle client-side tool execution</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> addToolOutput</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCallId: toolCall.toolCallId,</span></span> <span class="line"><span class="nb-shiki-140thh"> output: { result: </span><span class="nb-shiki-mdbnqw">"success"</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="dynamic-tool-approval">Dynamic Tool Approval</h4><a class="anchor-link" href="#dynamic-tool-approval"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use <code>needsApproval</code> on server tools to conditionally require user confirmation:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> paymentTool</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Process a payment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> amount: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> recipient: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">()</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> needsApproval</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">amount</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> amount </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 1000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">amount</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">recipient</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> processPayment</span><span class="nb-shiki-140thh">(amount, recipient);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="tool-confirmation-detection">Tool Confirmation Detection</h4><a class="anchor-link" href="#tool-confirmation-detection"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>isToolUIPart</code> and <code>getToolName</code> functions now check both static and dynamic tool parts:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { isToolUIPart, getToolName } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> pendingToolCallConfirmation</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> messages.</span><span class="nb-shiki-1t8gfj">some</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">m</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span></span> <span class="line"><span class="nb-shiki-140thh"> m.parts?.</span><span class="nb-shiki-1t8gfj">some</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">part</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> isToolUIPart</span><span class="nb-shiki-140thh">(part) </span><span class="nb-shiki-1itgoe">&amp;&amp;</span><span class="nb-shiki-140thh"> part.state </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "input-available"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ),</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Handle tool confirmation</span></span> <span class="line"><span class="nb-shiki-1itgoe">if</span><span class="nb-shiki-140thh"> (pendingToolCallConfirmation) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> addToolOutput</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCallId: part.toolCallId,</span></span> <span class="line"><span class="nb-shiki-140thh"> output: </span><span class="nb-shiki-mdbnqw">"User approved the action"</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>If you need the v5 behavior (static-only checks), use the new functions:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { isStaticToolUIPart, getStaticToolName } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="converttomodelmessages-is-now-async">convertToModelMessages() is now async</h4><a class="anchor-link" href="#converttomodelmessages-is-now-async"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>convertToModelMessages()</code> function is now asynchronous. Update all calls to await the result:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { convertToModelMessages } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> convertToModelMessages</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.messages),</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-1t8gfj">openai</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"gpt-4o"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="modelmessage-type">ModelMessage type</h4><a class="anchor-link" href="#modelmessage-type"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>CoreMessage</code> type has been removed. Use <code>ModelMessage</code> instead:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { convertToModelMessages, </span><span class="nb-shiki-1itgoe">type</span><span class="nb-shiki-140thh"> ModelMessage } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> modelMessages</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ModelMessage</span><span class="nb-shiki-140thh">[] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> convertToModelMessages</span><span class="nb-shiki-140thh">(messages);</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="generateobject-mode-option-removed">generateObject mode option removed</h4><a class="anchor-link" href="#generateobject-mode-option-removed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>mode</code> option for <code>generateObject</code> has been removed:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Before (v5)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateObject</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> mode: </span><span class="nb-shiki-mdbnqw">"json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> schema,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// After (v6)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateObject</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model,</span></span> <span class="line"><span class="nb-shiki-140thh"> schema,</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="structured-output-with-generatetext">Structured Output with generateText</h4><a class="anchor-link" href="#structured-output-with-generatetext"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>While <code>generateObject</code> and <code>streamObject</code> are still functional, the recommended approach is to use <code>generateText</code>/<code>streamText</code> with the <code>Output.object()</code> helper:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateText, Output, stepCountIs } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">output</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-1t8gfj">openai</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"gpt-4"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> output: Output.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> schema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ name: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() })</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> stopWhen: </span><span class="nb-shiki-1t8gfj">stepCountIs</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">2</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">"Generate a name"</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <blockquote> <p><strong>Note</strong>: When using structured output with <code>generateText</code>, you must configure multiple steps with <code>stopWhen</code> because generating the structured output is itself a step.</p> </blockquote> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai-provider-v300">workers-ai-provider v3.0.0</h4><a class="anchor-link" href="#workers-ai-provider-v300"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v3.0.0 with AI SDK v6 support.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="model-setup-with-workers-ai">Model Setup with Workers AI</h4><a class="anchor-link" href="#model-setup-with-workers-ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Cloudflare Workers AI models directly in your agent workflows:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createWorkersAI } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "workers-ai-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { useAgentChat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/ai-react"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Create Workers AI model (v3.0.0 - enhanced v6 internals)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> model</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createWorkersAI</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> binding: env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">})(</span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-3.2-3b-instruct"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enhanced-file-and-image-support">Enhanced File and Image Support</h4><a class="anchor-link" href="#enhanced-file-and-image-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Workers AI models now support v6 file handling with automatic conversion:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Send images and files to Workers AI models</span></span> <span class="line"><span class="nb-shiki-1t8gfj">sendMessage</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parts: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh">, text: </span><span class="nb-shiki-mdbnqw">"Analyze this image:"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"file"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> data: imageBuffer,</span></span> <span class="line"><span class="nb-shiki-140thh"> mediaType: </span><span class="nb-shiki-mdbnqw">"image/jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Workers AI provider automatically converts to proper format</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="streaming-with-workers-ai">Streaming with Workers AI</h4><a class="anchor-link" href="#streaming-with-workers-ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Enhanced streaming support with automatic warning detection:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Streaming with Workers AI models</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-1t8gfj">createWorkersAI</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh"> })(</span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-3.2-3b-instruct"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> convertToModelMessages</span><span class="nb-shiki-140thh">(messages),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onChunk</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">chunk</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Enhanced streaming with warning handling</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(chunk);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-gateway-provider-v300">ai-gateway-provider v3.0.0</h4><a class="anchor-link" href="#ai-gateway-provider-v300"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The ai-gateway-provider v3.0.0 now supports AI SDK v6, enabling you to use Cloudflare AI Gateway with multiple AI providers including Anthropic, Azure, AWS Bedrock, Google Vertex, and Perplexity.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ai-gateway-setup">AI Gateway Setup</h4><a class="anchor-link" href="#ai-gateway-setup"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Cloudflare AI Gateway to add analytics, caching, and rate limiting to your AI applications:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createAIGateway } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai-gateway-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Create AI Gateway provider (v3.0.0 - enhanced v6 internals)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> model</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createAIGateway</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> gatewayUrl: </span><span class="nb-shiki-mdbnqw">"https://gateway.ai.cloudflare.com/v1/your-account-id/gateway"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Authorization"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">`Bearer ${</span><span class="nb-shiki-140thh">env</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-dzsirb">AI_GATEWAY_TOKEN</span><span class="nb-shiki-mdbnqw">}`</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">})({</span></span> <span class="line"><span class="nb-shiki-140thh"> provider: </span><span class="nb-shiki-mdbnqw">"openai"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"gpt-4o"</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="migration-from-v5">Migration from v5</h4><a class="anchor-link" href="#migration-from-v5"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecated-apis">Deprecated APIs</h4><a class="anchor-link" href="#deprecated-apis"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following APIs are deprecated in favor of the unified tool pattern:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Deprecated</th> <th>Replacement</th> </tr> </thead> <tbody> <tr> <td><code>AITool</code> type</td> <td>Use AI SDK's <code>tool()</code> function on server</td> </tr> <tr> <td><code>extractClientToolSchemas()</code></td> <td>Define tools on server, no client schemas needed</td> </tr> <tr> <td><code>createToolsFromClientSchemas()</code></td> <td>Define tools on server with <code>tool()</code></td> </tr> <tr> <td><code>toolsRequiringConfirmation</code> option</td> <td>Use <code>needsApproval</code> on server tools</td> </tr> <tr> <td><code>experimental_automaticToolResolution</code></td> <td>Use <code>onToolCall</code> callback</td> </tr> <tr> <td><code>tools</code> option in <code>useAgentChat</code></td> <td>Use <code>onToolCall</code> for client-side execution</td> </tr> <tr> <td><code>addToolResult()</code></td> <td>Use <code>addToolOutput()</code></td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-changes-summary">Breaking Changes Summary</h4><a class="anchor-link" href="#breaking-changes-summary"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li><strong>Unified Tool Pattern</strong>: All tools must be defined on the server using <code>tool()</code></li> <li><strong><code>convertToModelMessages()</code> is async</strong>: Add <code>await</code> to all calls</li> <li><strong><code>CoreMessage</code> removed</strong>: Use <code>ModelMessage</code> instead</li> <li><strong><code>generateObject</code> mode removed</strong>: Remove <code>mode</code> option</li> <li><strong><code>isToolUIPart</code> behavior changed</strong>: Now checks both static and dynamic tool parts</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="installation">Installation</h4><a class="anchor-link" href="#installation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Update your dependencies to use the latest versions:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> install</span><span class="nb-shiki-mdbnqw"> agents@^0.3.0</span><span class="nb-shiki-mdbnqw"> workers-ai-provider@^3.0.0</span><span class="nb-shiki-mdbnqw"> ai-gateway-provider@^3.0.0</span><span class="nb-shiki-mdbnqw"> ai@^6.0.0</span><span class="nb-shiki-mdbnqw"> @ai-sdk/react@^3.0.0</span><span class="nb-shiki-mdbnqw"> @ai-sdk/openai@^3.0.0</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resources">Resources</h4><a class="anchor-link" href="#resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v6.md" target="_blank" rel="noopener">Migration Guide<span class="external-link"> ↗</span></a> - Comprehensive migration documentation from v5 to v6</li> <li><a href="https://ai-sdk.dev/docs/migration-guides/migration-guide-6-0" target="_blank" rel="noopener">AI SDK v6 Documentation<span class="external-link"> ↗</span></a> - Official AI SDK migration guide</li> <li><a href="https://vercel.com/blog/ai-sdk-6" target="_blank" rel="noopener">AI SDK v6 Announcement<span class="external-link"> ↗</span></a> - Learn about new features in v6</li> <li><a href="https://sdk.vercel.ai/docs" target="_blank" rel="noopener">AI SDK Documentation<span class="external-link"> ↗</span></a> - Complete AI SDK reference</li> <li><a href="https://github.com/cloudflare/agents/issues" target="_blank" rel="noopener">GitHub Issues<span class="external-link"> ↗</span></a> - Report bugs or request features</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="feedback-welcome">Feedback Welcome</h4><a class="anchor-link" href="#feedback-welcome"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We'd love your feedback! We're particularly interested in feedback on:</p> <ul> <li><strong>Migration experience</strong> - How smooth was the upgrade from v5 to v6?</li> <li><strong>Unified tool pattern</strong> - How does the new server-defined tool pattern work for you?</li> <li><strong>Dynamic tool approval</strong> - Does the <code>needsApproval</code> feature meet your needs?</li> <li><strong>AI Gateway integration</strong> - How well does the new provider work with your setup?</li> </ul>Mon, 22 Dec 2025 00:00:00 GMTAgentsAgentsWorkersCloudflare Fundamentals, Terraform - Terraform v5.15.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-12-19-terraform-v5.15.0-provider/https://developers.cloudflare.com/changelog/post/2025-12-19-terraform-v5.15.0-provider/<p>Earlier this year, we announced the launch of the new Terraform v5 Provider. We are aware of the high number of issues reported by the Cloudflare community related to the v5 release. We have committed to releasing improvements on a <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 week cadence<span class="external-link"> ↗</span></a> to ensure its stability and reliability, including the v5.15 release. We have also pivoted from an <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">issue-to-issue approach to a resource-per-resource approach<span class="external-link"> ↗</span></a> - we will be focusing on specific resources to not only stabilize the resource but also ensure it is migration-friendly for those migrating from v4 to v5.</p> <p>Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.</p> <p>This release includes bug fixes, the stabilization of even more popular resources, and more.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>ai_search:</strong> Add AI Search endpoints (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/6f02adb420e872457f71f95b49cb527663388915" target="_blank" rel="noopener">6f02adb<span class="external-link"> ↗</span></a>)</li> <li><strong>certificate_pack:</strong> Ensure proper Terraform resource ID handling for path parameters in API calls (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/081f32acab4ce9a194a7ff51c8e9fcabd349895a" target="_blank" rel="noopener">081f32a<span class="external-link"> ↗</span></a>)</li> <li><strong>worker_version:</strong> Support <code>startup_time_ms</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/286ab55bea8d5be0faa5a2b5b8b157e4a2214eba" target="_blank" rel="noopener">286ab55<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_custom_entry:</strong> Support <code>upload_status</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c" target="_blank" rel="noopener">7dc0fe3<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_entry:</strong> Support <code>upload_status</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c" target="_blank" rel="noopener">7dc0fe3<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_integration_entry:</strong> Support <code>upload_status</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c" target="_blank" rel="noopener">7dc0fe3<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_predefined_entry:</strong> Support <code>upload_status</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c" target="_blank" rel="noopener">7dc0fe3<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_gateway_policy:</strong> Support <code>forensic_copy</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/5741fd0ed9f7270d20731cc47ec45eb0403a628b" target="_blank" rel="noopener">5741fd0<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_list:</strong> Support additional types (category, location, device) (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/5741fd0ed9f7270d20731cc47ec45eb0403a628b" target="_blank" rel="noopener">5741fd0<span class="external-link"> ↗</span></a>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>access_rules:</strong> Add validation to prevent state drift. Ideally, we'd use Semantic Equality but since that isn't an option, this will remove a foot-gun. (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/44577911b3cbe45de6279aefa657bdee73c0794d" target="_blank" rel="noopener">4457791<span class="external-link"> ↗</span></a>)</li> <li><strong>cloudflare_pages_project:</strong> Addressing drift issues (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/6edffcfcf187fdc9b10b624b9a9b90aed2fb2b2e" target="_blank" rel="noopener">6edffcf<span class="external-link"> ↗</span></a>) (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/3db318e747423bf10ce587d9149e90edcd8a77b0" target="_blank" rel="noopener">3db318e<span class="external-link"> ↗</span></a>)</li> <li><strong>cloudflare_worker:</strong> Can be cleanly imported (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/4859b52968bb25570b680df9813f8e07fd50728f" target="_blank" rel="noopener">4859b52<span class="external-link"> ↗</span></a>)</li> <li><strong>cloudflare_worker:</strong> Ensure clean imports (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/5b525bc478a4e2c9c0d4fd659b92cc7f7c18016a" target="_blank" rel="noopener">5b525bc<span class="external-link"> ↗</span></a>)</li> <li><strong>list_items:</strong> Add validation for IP List items to avoid inconsistent state (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/b6733dc4be909a5ab35895a88e519fc2582ccada" target="_blank" rel="noopener">b6733dc<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_access_application:</strong> Remove all conditions from sweeper (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/3197f1aed61be326d507d9e9e3b795b9f1d18fd7" target="_blank" rel="noopener">3197f1a<span class="external-link"> ↗</span></a>)</li> <li><strong>spectrum_application:</strong> Map missing fields during spectrum resource import (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6495" target="_blank" rel="noopener">#6495<span class="external-link"> ↗</span></a>) (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/commit/ddb4e722b82c735825a549d651a9da219c142efa" target="_blank" rel="noopener">ddb4e72<span class="external-link"> ↗</span></a>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade-to-newer-version">Upgrade to newer version</h4><a class="anchor-link" href="#upgrade-to-newer-version"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest waiting to migrate to v5 while we work on stabilization. This helps with avoiding any blocking issues while the Terraform resources are actively being <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">stabilized<span class="external-link"> ↗</span></a>. We will be releasing a new migration tool in March 2026 to help support v4 to v5 transitions for our most popular resources.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Fri, 19 Dec 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers - Static prerendering support for TanStack Starthttps://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/https://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/<p><a href="https://tanstack.com/start/" target="_blank" rel="noopener">TanStack Start<span class="external-link"> ↗</span></a> apps can now prerender routes to static HTML at build time with access to build time environment variables and bindings, and serve them as <a href="https://developers.cloudflare.com/workers/static-assets/">static assets</a>. To enable prerendering, configure the <code>prerender</code> option of the TanStack Start plugin in your Vite config:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tanstackStart } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@tanstack/react-start/plugin/vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({ viteEnvironment: { name: </span><span class="nb-shiki-mdbnqw">"ssr"</span><span class="nb-shiki-140thh"> } }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> tanstackStart</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> prerender: {</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>This feature requires <code>@tanstack/react-start</code> v1.138.0 or later. See the <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/#static-prerendering">TanStack Start framework guide</a> for more details.</p>Fri, 19 Dec 2025 00:00:00 GMTWorkersWorkersAI Crawl Control - New AI Crawl Control Overview tabhttps://developers.cloudflare.com/changelog/post/2025-12-18-overview-tab/https://developers.cloudflare.com/changelog/post/2025-12-18-overview-tab/<p>The <strong>Overview</strong> tab is now the default view in AI Crawl Control. The previous default view with controls for individual AI crawlers is available in the <strong>Crawlers</strong> tab.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Executive summary</strong> — Monitor total requests, volume change, most common status code, most popular path, and high-volume activity</li> <li><strong>Operator grouping</strong> — Track crawlers by their operating companies (OpenAI, Microsoft, Google, ByteDance, Anthropic, Meta)</li> <li><strong>Customizable filters</strong> — Filter your snapshot by date range, crawler, operator, hostname, or path</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1113,height=839,format=webp/_astro/ai-crawl-control-overview-tab.Duwqq4bm.png" alt="AI Crawl Control Overview tab showing executive summary, metrics, and crawler groups" loading="lazy" decoding="async" width="1113" height="839"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Log in to the Cloudflare dashboard and select your account and domain.</li> <li>Go to <strong>AI Crawl Control</strong>, where the <strong>Overview</strong> tab opens by default with your activity snapshot.</li> <li>Use filters to customize your view by date range, crawler, operator, hostname, or path.</li> <li>Navigate to the <strong>Crawlers</strong> tab to manage controls for individual crawlers.</li> </ol> <p>Learn more about <a href="https://developers.cloudflare.com/ai-crawl-control/features/analyze-ai-traffic/">analyzing AI traffic</a> and <a href="https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/">managing AI crawlers</a>.</p>Thu, 18 Dec 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlAnalytics - Improved accuracy of cached request classification in analyticshttps://developers.cloudflare.com/changelog/post/2025-12-18-cached-request-classification/https://developers.cloudflare.com/changelog/post/2025-12-18-cached-request-classification/<p>The cached/uncached classification logic used in Zone Overview analytics has been updated to improve accuracy.</p> <p>Previously, requests were classified as "cached" based on an overly broad condition that included blocked 403 responses, Snippets requests, and other non-cache request types. This caused inflated cache hit ratios — in some cases showing near-100% cached — and affected approximately 15% of requests classified as cached in rollups.</p> <p>The condition has been removed from the Zone Overview page. Cached/uncached classification now aligns with the heuristics used in <a href="https://developers.cloudflare.com/analytics/account-and-zone-analytics/zone-analytics/">HTTP Analytics</a>, so only requests genuinely served from cache are counted as cached.</p> <p><strong>What changed:</strong></p> <ul> <li><strong>Zone Overview</strong> — Cache ratios now reflect actual cache performance.</li> <li><strong>HTTP Analytics</strong> — No change. HTTP Analytics already used the correct classification logic.</li> <li><strong>Historical data</strong> — This fix applies to new requests only. Previously logged data is not retroactively updated.</li> </ul>Thu, 18 Dec 2025 00:00:00 GMTAnalyticsAnalyticsR2, R2 Data Catalog - R2 Data Catalog now supports automatic snapshot expirationhttps://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/https://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/<p><a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> now supports automatic snapshot expiration for Apache Iceberg tables.</p> <p>In Apache Iceberg, a snapshot is metadata that represents the state of a table at a given point in time. Every mutation creates a new snapshot which enable powerful features like time travel queries and rollback capabilities but will accumulate over time.</p> <p>Without regular cleanup, these accumulated snapshots can lead to:</p> <ul> <li>Metadata overhead</li> <li>Slower table operations</li> <li>Increased storage costs.</li> </ul> <p>Snapshot expiration in R2 Data Catalog automatically removes old table snapshots based on your configured retention policy, improving performance and storage costs.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Enable catalog-level snapshot expiration</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Expire snapshots older than 7 days, always retain at least 10 recent snapshots</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> catalog</span><span class="nb-shiki-mdbnqw"> snapshot-expiration</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-mdbnqw"> my-bucket</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --older-than-days</span><span class="nb-shiki-dzsirb"> 7</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --retain-last</span><span class="nb-shiki-dzsirb"> 10</span></span></code></pre></figure> <p>Snapshot expiration uses two parameters to determine which snapshots to remove:</p> <ul> <li><code>--older-than-days</code>: age threshold in days</li> <li><code>--retain-last</code>: minimum snapshot count to retain</li> </ul> <p>Both conditions must be met before a snapshot is expired, ensuring you always retain recent snapshots even if they exceed the age threshold.</p> <p>This feature complements <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">automatic compaction</a>, which optimizes query performance by combining small data files into larger ones. Together, these automatic maintenance operations keep your Iceberg tables performant and cost-efficient without manual intervention.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">Table maintenance</a> or <a href="https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/">Manage catalogs</a>.</p>Thu, 18 Dec 2025 00:00:00 GMTR2R2R2 Data CatalogWAF - WAF Release - 2025-12-18https://developers.cloudflare.com/changelog/post/2025-12-18-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-18-waf-release/ <p>This week's release focuses on improvements to existing detections to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6429f7386b1546cf9dfce631be5ec20c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...be5ec20c</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Atlassian Confluence - Code Injection - CVE:CVE-2021-26084 - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "Atlassian Confluence - Code Injection - CVE:CVE-2021-26084" (ID: <rule-id id="e8c550810618437c953cf3a969e0b97a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...69e0b97a</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9108ddb347b3497e9f9351640d9206e3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d9206e3</span></button></rule-id></td><p><td>N/A</td> <td>PostgreSQL - SQLi - Copy - Beta</td> <td>Log</td> <td>Block</td><br> <td>This rule is merged into the original rule "PostgreSQL - SQLi - COPY" (ID: <rule-id id="705a6b5569d5472596910e3ce7265a4e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e7265a4e</span></button></rule-id>)</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cb687d73cc954092b58b90b00cd00ba7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0cd00ba7</span></button></rule-id></td><p><td>N/A</td> <td>Generic Rules - Command Execution - Body</td> <td>Log</td> <td>Disabled</td><br> <td>This is a new detection.</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bf30657ffa2a424cbf6570dbcd679ad4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cd679ad4</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - Header</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6df040f716194070a242967cfd181fb3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fd181fb3</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Command Execution - URI</td><td>Log</td><td>Disabled</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="39a4fdc37be948709fa7492e7a95bc3a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7a95bc3a</span></button></rule-id></td><td>N/A</td><td>SQLi - Tautology - URI - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - Tautology - URI" (ID: <rule-id id="4c580ea1b5174183b7f5e940b3de2e0a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b3de2e0a</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="810e0ffe1dd84e67b159129b432ac90d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...432ac90d</span></button></rule-id></td><td>N/A</td><td>SQLi - WaitFor Function - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - WaitFor Function" (ID: <rule-id id="b16fe708799441dea3049a99d5faba59"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d5faba59</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="80690005fef342e0ad6bc9af596c741e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...596c741e</span></button></rule-id></td><td>N/A</td><td>SQLi - AND/OR Digit Operator Digit 2 - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - AND/OR Digit Operator Digit" (ID: <rule-id id="98e7e08ae64247e2801ca4b388d80772"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...88d80772</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="eaf11ab80b0d491cbb7186f303b2f3fe"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...03b2f3fe</span></button></rule-id></td><td>N/A</td><td>SQLi - Equation 2 - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "SQLi - Equation" (ID: <rule-id id="133c6f83cdf14509a4ca6b82a72a6b3a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a72a6b3a</span></button></rule-id>)</td></tr></tbody></table>Thu, 18 Dec 2025 00:00:00 GMTWAFWAFWorkers for Platforms - Workers for Platforms - Dashboard Improvementshttps://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/https://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/<p><a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/">Workers for Platforms</a> lets you build multi-tenant platforms on <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>, allowing your end users to deploy and run their own code on your platform. It's designed for anyone building an AI vibe coding platform, e-commerce platform, website builder, or any product that needs to securely execute user-generated code at scale.</p> <p>Previously, setting up Workers for Platforms required using the API. Now, the Workers for Platforms UI supports namespace creation, dispatch worker templates, and tag management, making it easier for Workers for Platforms customers to build and manage multi-tenant platforms directly from the Cloudflare dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2226,height=1364,format=webp/_astro/dashboard-improvements.ChVWUo88.png" alt="Workers for Platforms Dashboard Improvements" loading="lazy" decoding="async" width="2226" height="1364"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-improvements">Key improvements</h4><a class="anchor-link" href="#key-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Namespace Management:</strong> You can now create and configure <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#dispatch-namespace">dispatch namespaces</a> directly within the dashboard to start a new platform setup.</li> <li><strong>Dispatch Worker Templates:</strong> New Dispatch Worker templates allow you to quickly define how traffic is routed to individual Workers within your namespace. Refer to the <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/dynamic-dispatch/">Dynamic Dispatch documentation</a> for more examples.</li> <li><strong>Tag Management:</strong> You can now set and update <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/tags/">tags</a> on User Workers, making it easier to group and manage your Workers.</li> <li><strong>Binding Visibility:</strong> <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/bindings/">Bindings</a> attached to User Workers are now visible directly within the User Worker view.</li> <li><strong>Deploy Vibe Coding Platform in one-click:</strong> Deploy a <a href="https://developers.cloudflare.com/reference-architecture/diagrams/ai/ai-vibe-coding-platform/">reference implementation</a> of an AI vibe coding platform directly from the dashboard. Powered by the Cloudflare's <a href="https://github.com/cloudflare/vibesdk" target="_blank" rel="noopener">VibeSDK<span class="external-link"> ↗</span></a>, this starter kit integrates with Workers for Platforms to handle the deployment of AI-generated projects at scale.</li> </ul> <p>To get started, go to <strong>Workers for Platforms</strong> under <strong>Compute &amp; AI</strong> in the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>.</p>Thu, 18 Dec 2025 00:00:00 GMTWorkers for PlatformsWorkers for PlatformsWorkers - Build image policies for Workers Builds and Cloudflare Pageshttps://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/https://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/<p>We've published build image policies for <a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#build-image-policy">Workers Builds</a> and <a href="https://developers.cloudflare.com/pages/configuration/build-image/#build-image-policy">Cloudflare Pages</a>, which establish:</p> <ul> <li><strong>Minor version updates</strong>: We typically update preinstalled software to the latest available minor version without notice. For tools that don't follow semantic versioning (e.g., Bun or Hugo), we provide 3 months’ notice.</li> <li><strong>Major version updates</strong>: Before preinstalled software reaches end-of-life, we update to the next stable LTS version with 3 months’ notice.</li> <li><strong>Build image version deprecation (Pages only)</strong>: We provide 6 months’ notice before deprecation. Projects on v1 or v2 will be automatically moved to v3 on their specified deprecation dates.</li> </ul> <p>To prepare for updates, monitor the <a href="https://developers.cloudflare.com/changelog/" target="_blank" rel="noopener">Cloudflare Changelog<span class="external-link"> ↗</span></a>, dashboard notifications, and email. You can also <a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#overriding-default-versions">override default versions</a> to maintain specific versions.</p>Thu, 18 Dec 2025 00:00:00 GMTWorkersWorkersWorkers - Retrieve your authentication token with `wrangler auth token`https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/<p>Wrangler now includes a new <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#auth-token"><code>wrangler auth token</code></a> command that retrieves your current authentication token or credentials for use with other tools and scripts.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> token</span></span></code></pre></figure> <p>The command returns whichever authentication method is currently configured, in priority order: API token from <code>CLOUDFLARE_API_TOKEN</code>, or OAuth token from <code>wrangler login</code> (automatically refreshed if expired).</p> <p>Use the <code>--json</code> flag to get structured output including the token type:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> auth</span><span class="nb-shiki-mdbnqw"> token</span><span class="nb-shiki-dzsirb"> --json</span></span></code></pre></figure> <p>The JSON output includes the authentication type:</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-21nrsd">// API token</span></span> <span class="line"><span class="nb-shiki-140thh">{ </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"api_token"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"token"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// OAuth token</span></span> <span class="line"><span class="nb-shiki-140thh">{ </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"oauth"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"token"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// API key/email (only available with --json)</span></span> <span class="line"><span class="nb-shiki-140thh">{ </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"api_key"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"email"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh"> }</span></span></code></pre></figure> <p>API key/email credentials from <code>CLOUDFLARE_API_KEY</code> and <code>CLOUDFLARE_EMAIL</code> require the <code>--json</code> flag since this method uses two values instead of a single token.</p>Thu, 18 Dec 2025 00:00:00 GMTWorkersWorkersGateway, Cloudflare One - Shadow IT - domain level SaaS analyticshttps://developers.cloudflare.com/changelog/post/2025-12-17-shadow-it-domain-analytics/https://developers.cloudflare.com/changelog/post/2025-12-17-shadow-it-domain-analytics/<p>Zero Trust has again upgraded its <strong>Shadow IT analytics</strong>, providing you with unprecedented visibility into your organizations use of SaaS tools. With this dashboard, you can review who is using an application and volumes of data transfer to the application.</p> <p>With this update, you can review data transfer metrics at the domain level, rather than just the application level, providing more granular insight into your data transfer patterns.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=452,format=webp/_astro/shadow-it-domain.DoZnGAtf.png" alt="New Domain Level Metrics" loading="lazy" decoding="async" width="1800" height="452"> <p>These metrics can be filtered by all available filters on the dashboard, including user, application, or content category.</p> <p>Both the analytics and policies are accessible in the Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>, empowering organizations with better visibility and control.</p>Wed, 17 Dec 2025 00:00:00 GMTGatewayGatewayCloudflare OneCloudflare One - New duplicate action for supported Cloudflare One resourceshttps://developers.cloudflare.com/changelog/post/2025-12-16-new-duplicate-action-for-supported-cloudflare-one-resources/https://developers.cloudflare.com/changelog/post/2025-12-16-new-duplicate-action-for-supported-cloudflare-one-resources/<p>You can now duplicate specific Cloudflare One resources with a single click from the dashboard.</p> <p>Initially supported resources:</p> <ul> <li>Access Applications</li> <li>Access Policies</li> <li>Gateway Policies</li> </ul> <p>To try this out, simply click on the overflow menu (⋮) from the resource table and click <i>Duplicate</i>. We will continue to add the Duplicate action for resources throughout 2026.</p>Tue, 16 Dec 2025 00:00:00 GMTCloudflare OneCloudflare OneWorkers - Support for ctx.exports in @cloudflare/vitest-pool-workershttps://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/https://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/<p>The <a href="https://developers.cloudflare.com/workers/testing/vitest-integration/"><code>@cloudflare/vitest-pool-workers</code></a> package now supports the <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#exports"><code>ctx.exports</code> API</a>, allowing you to access your Worker's top-level exports during tests.</p> <p>You can access <code>ctx.exports</code> in unit tests by calling <code>createExecutionContext()</code>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createExecutionContext } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:test"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { it, expect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">it</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"can access ctx.exports"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> ctx</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createExecutionContext</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ctx.exports.MyEntryPoint.</span><span class="nb-shiki-1t8gfj">myMethod</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(result).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"expected value"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Alternatively, you can import <code>exports</code> directly from <code>cloudflare:workers</code>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { exports } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { it, expect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">it</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"can access imported exports"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> exports</span><span class="nb-shiki-140thh">.MyEntryPoint.</span><span class="nb-shiki-1t8gfj">myMethod</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(result).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"expected value"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>See the <a href="https://github.com/cloudflare/workers-sdk/tree/main/fixtures/vitest-pool-workers-examples/context-exports" target="_blank" rel="noopener">context-exports fixture<span class="external-link"> ↗</span></a> for a complete example.</p>Tue, 16 Dec 2025 00:00:00 GMTWorkersWorkersWorkers - Configure your framework for Cloudflare automaticallyhttps://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/https://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/<p>Wrangler now supports automatic configuration for popular web frameworks in experimental mode, making it even easier to deploy to Cloudflare Workers.</p> <p>Previously, if you wanted to deploy an application using a popular web framework like Next.js or Astro, you had to follow tutorials to set up your application for deployment to Cloudflare Workers. This usually involved creating a Wrangler file, installing adapters, or changing configuration options.</p> <p>Now <code>wrangler deploy</code> does this for you. Starting with Wrangler 4.55, you can use <code>npx wrangler deploy --x-autoconfig</code> in the directory of any web application using one of the supported frameworks. Wrangler will then proceed to configure and deploy it to your Cloudflare account.</p> <p>You can also configure your application without deploying it by using the new <code>npx wrangler setup</code> command. This enables you to easily review what changes we are making so your application is ready for Cloudflare Workers.</p> <p>The following application frameworks are supported starting today:</p> <ul> <li>Next.js</li> <li>Astro</li> <li>Nuxt</li> <li>TanStack Start</li> <li>SolidStart</li> <li>React Router</li> <li>SvelteKit</li> <li>Docusaurus</li> <li>Qwik</li> <li>Analog</li> </ul> <p>Automatic configuration also supports static sites by detecting the assets directory and build command. From a single index.html file to the output of a generator like Jekyll or Hugo, you can just run <code>npx wrangler deploy --x-autoconfig</code> to upload to Cloudflare.</p> <p>We're really excited to bring you automatic configuration so you can do more with Workers. Please let us know if you run into challenges using this experimentally. We’ve opened a <a href="https://github.com/cloudflare/workers-sdk/discussions/11667" target="_blank" rel="noopener">GitHub discussion<span class="external-link"> ↗</span></a> and would love to hear your feedback.</p>Tue, 16 Dec 2025 00:00:00 GMTWorkersWorkersDurable Objects, Workers - New Best Practices guide for Durable Objectshttps://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/https://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/ <p>A new <a href="https://developers.cloudflare.com/durable-objects/best-practices/rules-of-durable-objects/">Rules of Durable Objects</a> guide is now available, providing opinionated best practices for building effective Durable Objects applications. This guide covers design patterns, storage strategies, concurrency, and common anti-patterns to avoid.</p> <p>Key guidance includes:</p> <ul> <li><strong>Design around your "atom" of coordination</strong> — Create one Durable Object per logical unit (chat room, game session, user) instead of a global singleton that becomes a bottleneck.</li> <li><strong>Use SQLite storage with RPC methods</strong> — SQLite-backed Durable Objects with typed RPC methods provide the best developer experience and performance.</li> <li><strong>Understand input and output gates</strong> — Learn how Cloudflare's runtime prevents data races by default, how write coalescing works, and when to use <code>blockConcurrencyWhile()</code>.</li> <li><strong>Leverage Hibernatable WebSockets</strong> — Reduce costs for real-time applications by allowing Durable Objects to sleep while maintaining WebSocket connections.</li> </ul> <p>The <a href="https://developers.cloudflare.com/durable-objects/examples/testing-with-durable-objects/">testing documentation</a> has also been updated with modern patterns using <code>@cloudflare/vitest-pool-workers</code>, including examples for testing SQLite storage, alarms, and direct instance access:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">test/counter.test.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env, runDurableObjectAlarm } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:test"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { it, expect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">it</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"can test Durable Objects with isolated storage"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">COUNTER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call RPC methods directly on the stub</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">increment</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">getCount</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Trigger alarms immediately without waiting</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> runDurableObjectAlarm</span><span class="nb-shiki-140thh">(stub);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">test/counter.test.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env, runDurableObjectAlarm } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:test"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { it, expect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vitest"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">it</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"can test Durable Objects with isolated storage"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">COUNTER</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call RPC methods directly on the stub</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">increment</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">getCount</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">toBe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Trigger alarms immediately without waiting</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> runDurableObjectAlarm</span><span class="nb-shiki-140thh">(stub);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div>Mon, 15 Dec 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersDurable Objects, Workers - Billing for SQLite Storagehttps://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/https://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/ <p>Storage billing for SQLite-backed Durable Objects will be enabled in January 2026, with a target date of January 7, 2026 (no earlier).</p> <p>To view your SQLite storage usage, go to the <strong>Durable Objects</strong> page</p> <a href="https://dash.cloudflare.com/?to=/:account/workers/durable-objects" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Durable Objects</strong>&nbsp;&#8599;</a> <p>If you do not want to incur costs, please take action such as optimizing queries or deleting unnecessary stored data in order to reduce your SQLite storage usage ahead of the January 7th target. Only usage on and after the billing target date will incur charges.</p> <p>Developers on the Workers Paid plan with Durable Object's SQLite storage usage beyond included limits will incur charges according to <a href="https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend">SQLite storage pricing</a> announced in September 2024 with the <a href="https://blog.cloudflare.com/sqlite-in-durable-objects/" target="_blank" rel="noopener">public beta<span class="external-link"> ↗</span></a>. Developers on the Workers Free plan will not be charged.</p> <p>Compute billing for SQLite-backed Durable Objects has been enabled since the initial public beta. SQLite-backed Durable Objects currently incur <a href="https://developers.cloudflare.com/durable-objects/platform/pricing/#compute-billing">charges for requests and duration</a>, and no changes are being made to compute billing.</p> <p>For more information about SQLite storage pricing and limits, refer to the <a href="https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend">Durable Objects pricing documentation</a>.</p>Fri, 12 Dec 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersR2 SQL - R2 SQL now supports aggregations and schema discoveryhttps://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/<p>R2 SQL now supports aggregation functions, <code>GROUP BY</code>, <code>HAVING</code>, along with schema discovery commands to make it easy to explore your data catalog.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="aggregation-functions">Aggregation Functions</h4><a class="anchor-link" href="#aggregation-functions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now perform aggregations on Apache Iceberg tables in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> using standard SQL functions including <code>COUNT(*)</code>, <code>SUM()</code>, <code>AVG()</code>, <code>MIN()</code>, and <code>MAX()</code>. Combine these with <code>GROUP BY</code> to analyze data across dimensions, and use <code>HAVING</code> to filter aggregated results.</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Calculate average transaction amounts by department</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> department, </span><span class="nb-shiki-dzsirb">COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">), </span><span class="nb-shiki-dzsirb">AVG</span><span class="nb-shiki-140thh">(total_amount)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-140thh"> region </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> 'North'</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> department</span></span> <span class="line"><span class="nb-shiki-1itgoe">HAVING</span><span class="nb-shiki-dzsirb"> COUNT</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 50</span></span> <span class="line"><span class="nb-shiki-1itgoe">ORDER BY</span><span class="nb-shiki-dzsirb"> AVG</span><span class="nb-shiki-140thh">(total_amount) </span><span class="nb-shiki-1itgoe">DESC</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-21nrsd">-- Find high-value departments</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span><span class="nb-shiki-140thh"> department, </span><span class="nb-shiki-dzsirb">SUM</span><span class="nb-shiki-140thh">(total_amount)</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-dzsirb"> my_namespace</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">sales_data</span></span> <span class="line"><span class="nb-shiki-1itgoe">GROUP BY</span><span class="nb-shiki-140thh"> department</span></span> <span class="line"><span class="nb-shiki-1itgoe">HAVING</span><span class="nb-shiki-dzsirb"> SUM</span><span class="nb-shiki-140thh">(total_amount) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> 50000</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="schema-discovery">Schema Discovery</h4><a class="anchor-link" href="#schema-discovery"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>New metadata commands make it easy to explore your data catalog and understand table structures:</p> <ul> <li><code>SHOW DATABASES</code> or <code>SHOW NAMESPACES</code> - List all available namespaces</li> <li><code>SHOW TABLES IN namespace_name</code> - List tables within a namespace</li> <li><code>DESCRIBE namespace_name.table_name</code> - View table schema and column types</li> </ul> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">❯</span><span class="nb-shiki-mdbnqw"> npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> sql</span><span class="nb-shiki-mdbnqw"> query</span><span class="nb-shiki-mdbnqw"> "{ACCOUNT_ID}_{BUCKET_NAME}"</span><span class="nb-shiki-mdbnqw"> "DESCRIBE default.sales_data;"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> ⛅️</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-dzsirb"> 4.54.0</span></span> <span class="line"><span class="nb-shiki-1t8gfj">─────────────────────────────────────────────</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">┌──────────────────┬────────────────┬──────────┬─────────────────┬───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> column_name</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> type</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> required</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> initial_default</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> write_default</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> doc</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> sale_id</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> BIGINT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Unique</span><span class="nb-shiki-mdbnqw"> identifier</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> each</span><span class="nb-shiki-mdbnqw"> sales</span><span class="nb-shiki-mdbnqw"> transaction</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> sale_timestamp</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> TIMESTAMPTZ</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Exact</span><span class="nb-shiki-mdbnqw"> date</span><span class="nb-shiki-mdbnqw"> and</span><span class="nb-shiki-mdbnqw"> time</span><span class="nb-shiki-mdbnqw"> when</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-mdbnqw"> occurred</span><span class="nb-shiki-140thh"> (used </span><span class="nb-shiki-mdbnqw">for</span><span class="nb-shiki-mdbnqw"> partitioning</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> department</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> TEXT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Product</span><span class="nb-shiki-mdbnqw"> department</span><span class="nb-shiki-140thh"> (8 </span><span class="nb-shiki-mdbnqw">categories:</span><span class="nb-shiki-mdbnqw"> Electronics,</span><span class="nb-shiki-mdbnqw"> Beauty,</span><span class="nb-shiki-mdbnqw"> Home,</span><span class="nb-shiki-mdbnqw"> Toys,</span><span class="nb-shiki-mdbnqw"> Sports,</span><span class="nb-shiki-mdbnqw"> Food,</span><span class="nb-shiki-mdbnqw"> Clothing,</span><span class="nb-shiki-mdbnqw"> Books</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> category</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> TEXT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Product</span><span class="nb-shiki-mdbnqw"> category</span><span class="nb-shiki-mdbnqw"> grouping</span><span class="nb-shiki-140thh"> (4 </span><span class="nb-shiki-mdbnqw">categories:</span><span class="nb-shiki-mdbnqw"> Premium,</span><span class="nb-shiki-mdbnqw"> Standard,</span><span class="nb-shiki-mdbnqw"> Budget,</span><span class="nb-shiki-mdbnqw"> Clearance</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> region</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> TEXT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Geographic</span><span class="nb-shiki-mdbnqw"> sales</span><span class="nb-shiki-mdbnqw"> region</span><span class="nb-shiki-140thh"> (5 </span><span class="nb-shiki-mdbnqw">regions:</span><span class="nb-shiki-mdbnqw"> North,</span><span class="nb-shiki-mdbnqw"> South,</span><span class="nb-shiki-mdbnqw"> East,</span><span class="nb-shiki-mdbnqw"> West,</span><span class="nb-shiki-mdbnqw"> Central</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> product_id</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> INT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Unique</span><span class="nb-shiki-mdbnqw"> identifier</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> product</span><span class="nb-shiki-mdbnqw"> sold</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> quantity</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> INT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Number</span><span class="nb-shiki-mdbnqw"> of</span><span class="nb-shiki-mdbnqw"> units</span><span class="nb-shiki-mdbnqw"> sold</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> this</span><span class="nb-shiki-mdbnqw"> transaction</span><span class="nb-shiki-140thh"> (range: </span><span class="nb-shiki-mdbnqw">1-50</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> unit_price</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> DECIMAL</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">10,</span><span class="nb-shiki-dzsirb"> 2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-mdbnqw">│</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Price</span><span class="nb-shiki-mdbnqw"> per</span><span class="nb-shiki-mdbnqw"> unit</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> dollars</span><span class="nb-shiki-140thh"> (range: </span><span class="nb-shiki-1jdh33">$5</span><span class="nb-shiki-mdbnqw">.00-</span><span class="nb-shiki-140thh">$500</span><span class="nb-shiki-mdbnqw">.00</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> total_amount</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> DECIMAL</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">10,</span><span class="nb-shiki-dzsirb"> 2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-mdbnqw">│</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Total</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-mdbnqw"> amount</span><span class="nb-shiki-mdbnqw"> before</span><span class="nb-shiki-mdbnqw"> tax</span><span class="nb-shiki-140thh"> (quantity </span><span class="nb-shiki-mdbnqw">×</span><span class="nb-shiki-mdbnqw"> unit_price</span><span class="nb-shiki-mdbnqw"> with</span><span class="nb-shiki-mdbnqw"> discounts</span><span class="nb-shiki-mdbnqw"> applied</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> discount_percent</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> INT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Discount</span><span class="nb-shiki-mdbnqw"> percentage</span><span class="nb-shiki-mdbnqw"> applied</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> this</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-140thh"> (0-50%) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> tax_amount</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> DECIMAL</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">10,</span><span class="nb-shiki-dzsirb"> 2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-mdbnqw">│</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Tax</span><span class="nb-shiki-mdbnqw"> amount</span><span class="nb-shiki-mdbnqw"> collected</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> this</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> profit_margin</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> DECIMAL</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">10,</span><span class="nb-shiki-dzsirb"> 2</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-mdbnqw">│</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Profit</span><span class="nb-shiki-mdbnqw"> margin</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> this</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-mdbnqw"> as</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> decimal</span><span class="nb-shiki-mdbnqw"> percentage</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> customer_id</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> INT</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Unique</span><span class="nb-shiki-mdbnqw"> identifier</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> customer</span><span class="nb-shiki-mdbnqw"> who</span><span class="nb-shiki-mdbnqw"> made</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> purchase</span><span class="nb-shiki-mdbnqw"> │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> is_online_sale</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> BOOLEAN</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Boolean</span><span class="nb-shiki-mdbnqw"> flag</span><span class="nb-shiki-mdbnqw"> indicating</span><span class="nb-shiki-mdbnqw"> if</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-mdbnqw"> was</span><span class="nb-shiki-mdbnqw"> made</span><span class="nb-shiki-mdbnqw"> online</span><span class="nb-shiki-140thh"> (true) or in-store (</span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤</span></span> <span class="line"><span class="nb-shiki-1t8gfj">│</span><span class="nb-shiki-mdbnqw"> sale_date</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> DATE</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-dzsirb"> false</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> │</span><span class="nb-shiki-mdbnqw"> Calendar</span><span class="nb-shiki-mdbnqw"> date</span><span class="nb-shiki-mdbnqw"> of</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> sale</span><span class="nb-shiki-140thh"> (extracted </span><span class="nb-shiki-mdbnqw">from</span><span class="nb-shiki-mdbnqw"> sale_timestamp</span><span class="nb-shiki-140thh">) │</span></span> <span class="line"><span class="nb-shiki-1t8gfj">└──────────────────┴────────────────┴──────────┴─────────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Read</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-mdbnqw"> B</span><span class="nb-shiki-mdbnqw"> across</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-mdbnqw"> files</span><span class="nb-shiki-mdbnqw"> from</span><span class="nb-shiki-mdbnqw"> R2</span></span> <span class="line"><span class="nb-shiki-1t8gfj">On</span><span class="nb-shiki-mdbnqw"> average,</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-mdbnqw"> B</span><span class="nb-shiki-mdbnqw"> /</span><span class="nb-shiki-mdbnqw"> s</span></span></code></pre></figure> <p>To learn more about the new aggregation capabilities and schema discovery commands, check out the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. If you're new to R2 SQL, visit our <a href="https://developers.cloudflare.com/r2-sql/get-started/">getting started guide</a> to begin querying your data.</p>Fri, 12 Dec 2025 00:00:00 GMTR2 SQLR2 SQLLogs - SentinelOne as Logpush destinationhttps://developers.cloudflare.com/changelog/post/2025-12-11-sentinelone-destination/https://developers.cloudflare.com/changelog/post/2025-12-11-sentinelone-destination/<p>Cloudflare Logpush now supports <strong>SentinelOne</strong> as a native destination.</p> <p>Logs from Cloudflare can be sent to <a href="https://www.sentinelone.com/" target="_blank" rel="noopener">SentinelOne AI SIEM<span class="external-link"> ↗</span></a> via <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a>. The destination can be configured through the Logpush UI in the Cloudflare dashboard or by using the <a href="https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/">Logpush API</a>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/sentinelone/">Destination Configuration</a> documentation.</p>Thu, 11 Dec 2025 00:00:00 GMTLogsLogsWAF - WAF Release - 2025-12-11 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-12-11-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-11-emergency-waf-release/ <p>This emergency release introduces rules for CVE-2025-55183 and CVE-2025-55184, targeting server-side function exposure and resource-exhaustion patterns, respectively.</p> <p><strong>Key Findings</strong></p> <p>Added coverage for Leaking Server Functions (CVE-2025-55183) and React Function DoS detection (CVE-2025-55184).</p> <p><strong>Impact</strong></p> <p>These updates strengthen protection for server-function abuse techniques (CVE-2025-55183, CVE-2025-55184) that may expose internal logic or disrupt application availability.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="17c5123f1ac049818765ebf2fefb4e9b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fefb4e9b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>React - Leaking Server Functions - CVE:CVE-2025-55183</td><td>N/A</td><td>Block</td><td>This was labeled as Generic - Server Function Source Code Exposure.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="3114709a3c3b4e3685052c7b251e86aa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...251e86aa</span></button></rule-id></td><td>N/A</td><td>React - Leaking Server Functions - CVE:CVE-2025-55183</td><td>N/A</td><td>Block</td><td>This was labeled as Generic - Server Function Source Code Exposure.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2694f1610c0b471393b21aef102ec699"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...102ec699</span></button></rule-id></td><td>N/A</td><td>React - DoS - CVE:CVE-2025-55184</td><td>N/A</td><td>Disabled</td><td>This was labeled as Generic – Server Function Resource Exhaustion.</td></tr></tbody></table>Thu, 11 Dec 2025 00:00:00 GMTWAFWAFAI Crawl Control - Pay Per Crawl (Private beta) - Discovery API, custom pricing, and advanced configurationhttps://developers.cloudflare.com/changelog/post/2025-12-10-pay-per-crawl-enhancements/https://developers.cloudflare.com/changelog/post/2025-12-10-pay-per-crawl-enhancements/<p>Pay Per Crawl is introducing enhancements for both AI crawler operators and site owners, focusing on programmatic discovery, flexible pricing models, and granular configuration control.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-ai-crawler-operators">For AI crawler operators</h4><a class="anchor-link" href="#for-ai-crawler-operators"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="discovery-api">Discovery API</h4><a class="anchor-link" href="#discovery-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A new authenticated API endpoint allows verified crawlers to programmatically discover domains participating in Pay Per Crawl. Crawlers can use this to build optimized crawl queues, cache domain lists, and identify new participating sites. This eliminates the need to discover payable content through trial requests.</p> <p>The API endpoint is <code>GET https://crawlers-api.ai-audit.cfdata.org/charged_zones</code> and requires Web Bot Auth authentication. Refer to <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/discover-payable-content/">Discover payable content</a> for authentication steps, request parameters, and response schema.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="payment-header-signature-requirement">Payment header signature requirement</h4><a class="anchor-link" href="#payment-header-signature-requirement"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Payment headers (<code>crawler-exact-price</code> or <code>crawler-max-price</code>) must now be included in the Web Bot Auth <code>signature-input</code> header components. This security enhancement prevents payment header tampering, ensures authenticated payment intent, validates crawler identity with payment commitment, and protects against replay attacks with modified pricing. Crawlers must add their payment header to the list of signed components when <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/crawl-pages/#22-sign-your-request-with-web-bot-auth">constructing the signature-input header</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-crawler-error-header">New <code>crawler-error</code> header</h4><a class="anchor-link" href="#new-crawler-error-header"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Pay Per Crawl error responses now include a new <code>crawler-error</code> header with 11 specific <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/error-codes/">error codes</a> for programmatic handling. Error response bodies remain unchanged for compatibility. These codes enable robust error handling, automated retry logic, and accurate spending tracking.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-site-owners">For site owners</h4><a class="anchor-link" href="#for-site-owners"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configure-free-pages">Configure free pages</h4><a class="anchor-link" href="#configure-free-pages"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Site owners can now offer free access to specific pages like homepages, navigation, or discovery pages while charging for other content. Create a <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-site-owner/advanced-configuration/#disable-pay-per-crawl-by-uri-pattern">Configuration Rule</a> in <strong>Rules</strong> &gt; <strong>Configuration Rules</strong>, set your URI pattern using wildcard, exact, or prefix matching on the <strong>URI Full</strong> field, and enable the <strong>Disable Pay Per Crawl</strong> setting. When disabled for a URI pattern, crawler requests pass through without blocking or charging.</p> <p>Some paths are always free to crawl. These paths are: <code>/robots.txt</code>, <code>/sitemap.xml</code>, <code>/security.txt</code>, <code>/.well-known/security.txt</code>, <code>/crawlers.json</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>AI crawler operators</strong>: <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/discover-payable-content/">Discover payable content</a> | <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/crawl-pages/">Crawl pages</a></p> <p><strong>Site owners</strong>: <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-site-owner/advanced-configuration/">Advanced configuration</a></p>Wed, 10 Dec 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlWAF - WAF Release - 2025-12-10 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-12-10-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-10-emergency-waf-release/ <p>This additional week's emergency release introduces improvements to our existing rule for React – Remote Code Execution – CVE-2025-55182 - 2, along with two new generic detections covering server-side function exposure and resource-exhaustion patterns.</p> <p><strong>Key Findings</strong></p> <p>Enhanced detection logic for React – RCE – CVE-2025-55182, added Generic – Server Function Source Code Exposure, and added Generic – Server Function Resource Exhaustion.</p> <p><strong>Impact</strong></p> <p>These updates strengthen protection against React RCE exploitation attempts and broaden coverage for common server-function abuse techniques that may expose internal logic or disrupt application availability.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bc1aee59731c488ca8b5314615fce168"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...15fce168</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>React - Remote Code Execution - CVE:CVE-2025-55182 - 2</td><td>N/A</td><td>Block</td><td>This is an improved detection.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="cbdd3f48396e4b7389d6efd174746aff"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...74746aff</span></button></rule-id></td><td>N/A</td><td>React - Remote Code Execution - CVE:CVE-2025-55182 - 2</td><td>N/A</td><td>Block</td><td>This is an improved detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="17c5123f1ac049818765ebf2fefb4e9b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fefb4e9b</span></button></rule-id></td><td>N/A</td><td>Generic - Server Function Source Code Exposure</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="3114709a3c3b4e3685052c7b251e86aa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...251e86aa</span></button></rule-id></td><td>N/A</td><td>Generic - Server Function Source Code Exposure</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2694f1610c0b471393b21aef102ec699"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...102ec699</span></button></rule-id></td><td>N/A</td><td>Generic - Server Function Resource Exhaustion</td><td>N/A</td><td>Disabled</td><td>This is a new detection.</td></tr></tbody></table>Wed, 10 Dec 2025 00:00:00 GMTWAFWAFCloudflare One Client - WARP client for Windows (version 2025.10.118.1)https://developers.cloudflare.com/changelog/post/2025-12-09-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2025-12-09-warp-windows-beta/<p>A new Beta release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">Local Domain Fallback</a> feature has been fixed for devices running WARP client version 2025.4.929.0 and newer. Previously, these devices could experience failures with Local Domain Fallback unless a fallback server was explicitly configured. This configuration is no longer a requirement for the feature to function correctly.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> now supports transparent HTTP proxying in addition to CONNECT-based proxying.</li> <li>Fixed an issue where sending large messages to the WARP daemon by Inter-Process Communication (IPC) could cause WARP to crash and result in service interruptions.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 09 Dec 2025 23:03:10 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.10.118.1)https://developers.cloudflare.com/changelog/post/2025-12-09-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2025-12-09-warp-macos-beta/<p>A new Beta release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/">Local Domain Fallback</a> feature has been fixed for devices running WARP client version 2025.4.929.0 and newer. Previously, these devices could experience failures with Local Domain Fallback unless a fallback server was explicitly configured. This configuration is no longer a requirement for the feature to function correctly.</li> <li><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> now supports transparent HTTP proxying in addition to CONNECT-based proxying.</li> </ul> Tue, 09 Dec 2025 23:02:28 GMTCloudflare One ClientCloudflare One ClientWorkers - Python cold start improvementshttps://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/https://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/<p>Python Workers now feature improved cold start performance, reducing initialization time for new Worker instances. This improvement is particularly noticeable for Workers with larger dependency sets or complex initialization logic.</p> <p>Every time you deploy a Python Worker, a memory snapshot is captured after the top level of the Worker is executed. This snapshot captures all imports, including package imports that are often costly to load. The memory snapshot is loaded when the Worker is first started, avoiding the need to reload the Python runtime and all dependencies on each cold start.</p> <p>We set up a benchmark that imports common packages (<a href="https://www.python-httpx.org/" target="_blank" rel="noopener">httpx<span class="external-link"> ↗</span></a>, <a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">fastapi<span class="external-link"> ↗</span></a> and <a href="https://docs.pydantic.dev/latest/" target="_blank" rel="noopener">pydantic<span class="external-link"> ↗</span></a>) to see how Python Workers stack up against other platforms:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Platform</th> <th>Mean Cold Start (ms)</th> </tr> </thead> <tbody> <tr> <td>Cloudflare Python Workers</td> <td>1027</td> </tr> <tr> <td>AWS Lambda</td> <td>2502</td> </tr> <tr> <td>Google Cloud Run</td> <td>3069</td> </tr> </tbody> </table></div> <p>These benchmarks run continuously. You can view the results and the methodology on our <a href="https://cold.edgeworker.net" target="_blank" rel="noopener">benchmark page<span class="external-link"> ↗</span></a>.</p> <p>In additional testing, we have found that without any memory snapshot, the cold start for this benchmark takes around 10 seconds, so this change improves cold start performance by roughly a factor of 10.</p> <p>To get started with Python Workers, check out our <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers overview</a>.</p>Mon, 08 Dec 2025 00:00:00 GMTWorkersWorkersWorkers - Easy Python package management with Pywranglerhttps://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/https://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/<p>We are introducing a brand new tool called Pywrangler, which simplifies package management in Python Workers by automatically installing Workers-compatible Python packages into your project.</p> <p>With Pywrangler, you specify your Worker's Python dependencies in your <code>pyproject.toml</code> file:</p> <figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">project</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"python-beautifulsoup-worker"</span></span> <span class="line"><span class="nb-shiki-140thh">version = </span><span class="nb-shiki-mdbnqw">"0.1.0"</span></span> <span class="line"><span class="nb-shiki-140thh">description = </span><span class="nb-shiki-mdbnqw">"A simple Worker using beautifulsoup4"</span></span> <span class="line"><span class="nb-shiki-140thh">requires-python = </span><span class="nb-shiki-mdbnqw">"&gt;=3.12"</span></span> <span class="line"><span class="nb-shiki-140thh">dependencies = [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "beautifulsoup4"</span></span> <span class="line"><span class="nb-shiki-140thh">]</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">dependency-groups</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">dev = [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "workers-py"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "workers-runtime-sdk"</span></span> <span class="line"><span class="nb-shiki-140thh">]</span></span></code></pre></figure> <p>You can then develop and deploy your Worker using the following commands:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">uv</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> pywrangler</span><span class="nb-shiki-mdbnqw"> dev</span></span> <span class="line"><span class="nb-shiki-1t8gfj">uv</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> pywrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <p>Pywrangler automatically downloads and vendors the necessary packages for your Worker, and these packages are bundled with the Worker when you deploy.</p> <p>Consult the <a href="https://developers.cloudflare.com/workers/languages/python/packages/">Python packages documentation</a> for full details on Pywrangler and Python package management in Workers.</p>Mon, 08 Dec 2025 00:00:00 GMTWorkersWorkersWorkers - Wrangler config is optional when using Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/https://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/<p>When using the <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a> to build and deploy Workers, a Wrangler configuration file is now optional for assets-only (static) sites. If no <code>wrangler.toml</code>, <code>wrangler.json</code>, or <code>wrangler.jsonc</code> file is found, the plugin generates sensible defaults for an assets-only site. The <code>name</code> is based on the <code>package.json</code> or the project directory name, and the <code>compatibility_date</code> uses the latest date supported by your installed Miniflare version.</p> <p>This allows easier setup for static sites using Vite. Note that SPAs will still need to <a href="https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/" target="_blank" rel="noopener">set <code>assets.not_found_handling</code> to <code>single-page-application</code><span class="external-link"> ↗</span></a> in order to function correctly.</p>Mon, 08 Dec 2025 00:00:00 GMTWorkersWorkersWorkers - Configure Workers programmatically using the Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/https://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/<p>The <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a> now supports programmatic configuration of Workers without a Wrangler configuration file. You can use the <code>config</code> option to define Worker settings directly in your Vite configuration, or to modify existing configuration loaded from a Wrangler config file. This is particularly useful when integrating with other build tools or frameworks, as it allows them to control Worker configuration without needing users to manage a separate config file.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="the-config-option">The <code>config</code> option</h4><a class="anchor-link" href="#the-config-option"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Vite plugin's new <code>config</code> option accepts either a partial configuration object or a function that receives the current configuration and returns overrides. This option is applied after any config file is loaded, allowing the plugin to override specific values or define Worker configuration entirely in code.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-usage">Example usage</h4><a class="anchor-link" href="#example-usage"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Setting <code>config</code> to an object to provide configuration values that merge with defaults and config file settings:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> config: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> compatibility_flags: [</span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> send_email: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"EMAIL"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Use a function to modify the existing configuration:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> config</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">userConfig</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> delete</span><span class="nb-shiki-140thh"> userConfig.compatibility_flags;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Return an object with values to merge:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> config</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">userConfig</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">userConfig.compatibility_flags.</span><span class="nb-shiki-1t8gfj">includes</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"no_nodejs_compat"</span><span class="nb-shiki-140thh">)) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { compatibility_flags: [</span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh">] };</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="auxiliary-workers">Auxiliary Workers</h4><a class="anchor-link" href="#auxiliary-workers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Auxiliary Workers also support the <code>config</code> option, enabling multi-Worker architectures without config files.</p> <p>Define auxiliary Workers without config files using <code>config</code> inside the <code>auxiliaryWorkers</code> array:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> config: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"entry-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> main: </span><span class="nb-shiki-mdbnqw">"./src/entry.ts"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> services: [{ binding: </span><span class="nb-shiki-mdbnqw">"API"</span><span class="nb-shiki-140thh">, service: </span><span class="nb-shiki-mdbnqw">"api-worker"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> auxiliaryWorkers: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> config: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"api-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> main: </span><span class="nb-shiki-mdbnqw">"./src/api.ts"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>For more details and examples, see <a href="https://developers.cloudflare.com/workers/vite-plugin/reference/programmatic-configuration/">Programmatic configuration</a>.</p>Mon, 08 Dec 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Terraform - Terraform v5.14.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-12-05-terraform-v5.14.0-provider/https://developers.cloudflare.com/changelog/post/2025-12-05-terraform-v5.14.0-provider/<p>Earlier this year, we announced the launch of the new Terraform v5 Provider. We are aware of the high number of issues reported by the Cloudflare community related to the v5 release. We have committed to releasing improvements on a <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 week cadence<span class="external-link"> ↗</span></a> to ensure its stability and reliability, including the v5.14 release. We have also pivoted from an <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">issue-to-issue approach to a resource-per-resource approach<span class="external-link"> ↗</span></a> - we will be focusing on specific resources to not only stabilize the resource but also ensure it is migration-friendly for those migrating from v4 to v5.</p> <p>Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.</p> <p>This release includes bug fixes, the stabilization of even more popular resources, and more.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deprecation-notice">Deprecation notice</h4><a class="anchor-link" href="#deprecation-notice"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Resource affected: <code>api_shield_discovery_operation</code></p> <p>Cloudflare continuously discovers and updates API endpoints and web assets of your web applications. To improve the maintainability of these dynamic resources, we are working on reducing the need to actively engage with discovered operations.</p> <p>The corresponding public API endpoint of <a href="https://developers.cloudflare.com/api/resources/api_gateway/subresources/discovery/subresources/operations/" target="_blank" rel="noopener">discovered operations<span class="external-link"> ↗</span></a> is not affected and will continue to be supported.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>pages_project</strong>: Add v4 -&gt; v5 migration tests (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/pull/6506" target="_blank" rel="noopener">#6506<span class="external-link"> ↗</span></a>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_members</strong>: Makes member policies a set (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6488" target="_blank" rel="noopener">#6488<span class="external-link"> ↗</span></a>)</li> <li><strong>pages_project</strong>: Ensures non empty refresh plans (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6515" target="_blank" rel="noopener">#6515<span class="external-link"> ↗</span></a>)</li> <li><strong>R2</strong>: Improves sweeper (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6512" target="_blank" rel="noopener">#6512<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_kv</strong>: Ignores value import state for verify (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6521" target="_blank" rel="noopener">#6521<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_script</strong>: No longer treats the migrations attribute as WriteOnly (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6489" target="_blank" rel="noopener">#6489<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_script</strong>: Resolves resource drift when worker has unmanaged secret (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6504" target="_blank" rel="noopener">#6504<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_device_posture_rule</strong>: Preserves input.version and other fields (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6500" target="_blank" rel="noopener">#6500<span class="external-link"> ↗</span></a>) and (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6503" target="_blank" rel="noopener">#6503<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_custom_profile</strong>: Adds sweepers for <code>dlp_custom_profile</code></li> <li><strong>zone_subscription|account_subscription</strong>: Adds <code>partners_ent</code> as valid enum for <code>rate_plan.id</code> (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6505" target="_blank" rel="noopener">#6505<span class="external-link"> ↗</span></a>)</li> <li><strong>zone</strong>: Ensures datasource model schema parity (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6487" target="_blank" rel="noopener">#6487<span class="external-link"> ↗</span></a>)</li> <li><strong>subscription</strong>: Updates import signature to accept account_id/subscription_id to import account subscription (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6510" target="_blank" rel="noopener">#6510<span class="external-link"> ↗</span></a>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade-to-newer-version">Upgrade to newer version</h4><a class="anchor-link" href="#upgrade-to-newer-version"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest waiting to migrate to v5 while we work on stabilization. This helps with avoiding any blocking issues while the Terraform resources are actively being <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">stabilized<span class="external-link"> ↗</span></a>. We will be releasing a new migration tool in March 2026 to help support v4 to v5 transitions for our most popular resources.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/" target="_blank" rel="noopener">Documentation on using Terraform with Cloudflare<span class="external-link"> ↗</span></a></li> </ul>Fri, 05 Dec 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - Increased WAF payload limit for all planshttps://developers.cloudflare.com/changelog/post/2025-12-05-rcs-vuln/https://developers.cloudflare.com/changelog/post/2025-12-05-rcs-vuln/<p>Cloudflare WAF now inspects request-payload size of up to 1 MB across all plans to enhance our detection capabilities for React RCE (CVE-2025-55182).</p> <p><strong>Key Findings</strong></p> <p>React payloads commonly have a default maximum size of 1 MB. Cloudflare WAF previously inspected up to 128 KB on Enterprise plans, with even lower limits on other plans.</p> <p><strong>Update:</strong> We later reinstated the maximum request-payload size the Cloudflare WAF inspects. Refer to <a href="https://developers.cloudflare.com/changelog/2025-12-05-waf-max-payload-size-change/">Updating the WAF maximum payload values</a> for details.</p>Fri, 05 Dec 2025 00:00:00 GMTWAFWAFWAF - Updating the WAF maximum payload valueshttps://developers.cloudflare.com/changelog/post/2025-12-05-waf-max-payload-size-change/https://developers.cloudflare.com/changelog/post/2025-12-05-waf-max-payload-size-change/<p>We are reinstating the maximum request-payload size the Cloudflare WAF inspects, with WAF on Enterprise zones inspecting up to 128 KB.</p> <p><strong>Key Findings</strong></p> <p>On <a href="https://developers.cloudflare.com/changelog/2025-12-05-rcs-vuln/">December 5, 2025</a>, we initially attempted to increase the maximum WAF payload limit to 1 MB across all plans. However, an automatic rollout for all customers proved impractical because the increase led to a surge in false positives for existing managed rules.</p> <p>This issue was particularly notable within the Cloudflare Managed Ruleset and the Cloudflare OWASP Core Ruleset, impacting customer traffic.</p> <p><strong>Impact</strong></p> <p>Customers on paid plans can increase the limit to 1 MB for any of their zones by contacting Cloudflare Support. Free zones are already protected up to 1 MB and do not require any action.</p>Fri, 05 Dec 2025 00:00:00 GMTWAFWAFHyperdrive - Connect to remote databases during local development with wrangler devhttps://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/https://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/<p>You can now connect directly to remote databases and databases requiring TLS with <code>wrangler dev</code>. This lets you run your Worker code locally while connecting to remote databases, without needing to use <code>wrangler dev --remote</code>.</p> <p>The <code>localConnectionString</code> field and <code>CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_&lt;BINDING_NAME&gt;</code> environment variable can be used to configure the connection string used by <code>wrangler dev</code>.</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "hyperdrive"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"HYPERDRIVE"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"your-hyperdrive-id"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "localConnectionString"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"postgres://user:password@remote-host.example.com:5432/database?sslmode=require"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Learn more about <a href="https://developers.cloudflare.com/hyperdrive/configuration/local-development/">local development with Hyperdrive</a>.</p>Thu, 04 Dec 2025 00:00:00 GMTHyperdriveHyperdriveWorkers - One-click Access protection for Workers now creates reusable Cloudflare Access policieshttps://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/https://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/<p>Workers applications now use reusable <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access policies</a> to reduce duplication and simplify access management across multiple Workers.</p> <p>Previously, enabling Cloudflare Access on a Worker created per-application policies, unique to each application. Now, we create reusable policies that can be shared across applications:</p> <ul> <li> <p><strong>Preview URLs</strong>: All Workers preview URLs share a single "Cloudflare Workers Preview URLs" policy across your account. This policy is automatically created the first time you enable Access on any preview URL. By sharing a single policy across all preview URLs, you can configure access rules once and have them apply company-wide to all Workers which protect preview URLs. This makes it much easier to manage who can access preview environments without having to update individual policies for each Worker.</p> </li> <li> <p><strong>Production workers.dev URLs</strong>: When enabled, each Worker gets its own reusable policy (named <code>&lt;worker-name&gt; - Production</code>) by default. We recognize production services often have different access requirements and having individual policies here makes it easier to configure service-to-service authentication or protect internal dashboards or applications with specific user groups. Keeping these policies separate gives you the flexibility to configure exactly the right access rules for each production service. When you disable Access on a production Worker, the associated policy is automatically cleaned up if it's not being used by other applications.</p> </li> </ul> <p>This change reduces policy duplication, simplifies cross-company access management for preview environments, and provides the flexibility needed for production services. You can still customize access rules by editing the reusable policies in the Zero Trust dashboard.</p> <p>To enable Cloudflare Access on your Worker:</p> <ol> <li>In the Cloudflare dashboard, go to <strong>Workers &amp; Pages</strong>.</li> <li>Select your Worker.</li> <li>Go to <strong>Settings</strong> &gt; <strong>Domains &amp; Routes</strong>.</li> <li>For <code>workers.dev</code> or Preview URLs, click <strong>Enable Cloudflare Access</strong>.</li> <li>Optionally, click <strong>Manage Cloudflare Access</strong> to customize the policy.</li> </ol> <p>For more information on configuring Cloudflare Access for Workers, refer to the <a href="https://developers.cloudflare.com/workers/configuration/routing/workers-dev/#manage-access-to-workersdev">Workers Access documentation</a>.</p>Thu, 04 Dec 2025 00:00:00 GMTWorkersWorkersEmail security - Reclassifications to Submissionshttps://developers.cloudflare.com/changelog/post/2025-12-03-submission-terminology-update/https://developers.cloudflare.com/changelog/post/2025-12-03-submission-terminology-update/<p>We have updated the terminology “Reclassify” and “Reclassifications” to “Submit” and “Submissions” respectively. This update more accurately reflects the outcome of providing these items to Cloudflare.</p> <p>Submissions are leveraged to tune future variants of campaigns. To respect data sanctity, providing a submission does not change the original disposition of the emails submitted.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=756,height=628,format=webp/_astro/reclassification-submission.B6nL5Hw7.png" alt="nav_example" loading="lazy" decoding="async" width="756" height="628"> <p>This applies to all Email Security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Wed, 03 Dec 2025 21:11:33 GMTEmail securityEmail securityWAF - WAF Release - 2025-12-03 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-12-03-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-03-emergency-waf-release/ <p>The WAF rule deployed yesterday to block unsafe deserialization-based RCE has been updated. The rule description now reads “React – RCE – CVE-2025-55182”, explicitly mapping to the recently disclosed React Server Components vulnerability. Detection logic remains unchanged.</p> <p><strong>Key Findings</strong></p> <p>Rule description updated to reference React – RCE – CVE-2025-55182 while retaining existing unsafe-deserialization detection.</p> <p><strong>Impact</strong></p> <p>Improved classification and traceability with no change to coverage against remote code execution attempts.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="33aa8a8a948b48b28d40450c5fb92fba"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5fb92fba</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>React - RCE - CVE:CVE-2025-55182</td><td>N/A</td><td>Block</td><td>Rule metadata description changed. Detection unchanged.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="2b5d06e34a814a889bee9a0699702280"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...99702280</span></button></rule-id></td><td>N/A</td><td>React - RCE - CVE:CVE-2025-55182</td><td>N/A</td><td>Block</td><td>Rule metadata description changed. Detection unchanged.</td></tr></tbody></table>Wed, 03 Dec 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-12-02 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-12-02-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-02-emergency-waf-release/ <p>This week's emergency release introduces a new rule to block a critical RCE vulnerability in widely-used web frameworks through unsafe deserialization patterns.</p> <p><strong>Key Findings</strong></p> <p>New WAF rule deployed for RCE Generic Framework to block malicious POST requests containing unsafe deserialization patterns. If successfully exploited, this vulnerability allows attackers with network access via HTTP to execute arbitrary code remotely.</p> <p><strong>Impact</strong></p> <ul> <li>Successful exploitation allows unauthenticated attackers to execute arbitrary code remotely through crafted serialization payloads, enabling complete system compromise, data exfiltration, and potential lateral movement within affected environments.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="33aa8a8a948b48b28d40450c5fb92fba"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5fb92fba</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>RCE Generic - Framework</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Free Ruleset</td><td><rule-id id="2b5d06e34a814a889bee9a0699702280"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...99702280</span></button></rule-id></td><td>N/A</td><td>RCE Generic - Framework</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Tue, 02 Dec 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-12-01https://developers.cloudflare.com/changelog/post/2025-12-01-waf-release/https://developers.cloudflare.com/changelog/post/2025-12-01-waf-release/ <p>This week’s release introduces new detections for remote code execution attempts targeting Monsta FTP (CVE-2025-34299), alongside improvements to an existing XSS detection to enhance coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2025-34299 is a critical remote code execution flaw in Monsta FTP, arising from improper handling of user-supplied parameters within the file-handling interface. Certain builds allow crafted requests to bypass sanitization and reach backend PHP functions that execute arbitrary commands. Attackers can send manipulated parameters through the web panel to trigger command execution within the application’s runtime environment.</li> </ul> <p><strong>Impact</strong></p> <p>If exploited, the vulnerability enables full remote command execution on the underlying server, allowing takeover of the hosting environment, unauthorized file access, and potential lateral movement. As the flaw can be triggered without authentication on exposed Monsta FTP instances, it represents a severe risk for publicly reachable deployments.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="480da5e7984542a6b8d8d88da4fcc8a8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a4fcc8a8</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Monsta FTP - Remote Code Execution - CVE:CVE-2025-34299</td><td>Log</td><td>Block</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2380b125c53d42ac94479c42b7492846"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b7492846</span></button></rule-id></td><td>N/A</td><td>XSS - JS Context Escape - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "XSS - JS Context Escape" (ID: <rule-id id="c1ad1bc37caa4cbeb104f44f7a3769d3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7a3769d3</span></button></rule-id>)</td></tr></tbody></table>Mon, 01 Dec 2025 00:00:00 GMTWAFWAFAgents, Workers - Agents SDK v0.2.24 with resumable streaming, MCP improvements, and schedule fixeshttps://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/https://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/<p>The latest release of <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">@cloudflare/agents<span class="external-link"> ↗</span></a> brings resumable streaming, significant MCP client improvements, and critical fixes for schedules and Durable Object lifecycle management.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resumable-streaming">Resumable streaming</h4><a class="anchor-link" href="#resumable-streaming"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><code>AIChatAgent</code> now supports resumable streaming, allowing clients to reconnect and continue receiving streamed responses without losing data. This is useful for:</p> <ul> <li>Long-running AI responses</li> <li>Users on unreliable networks</li> <li>Users switching between devices mid-conversation</li> <li>Background tasks where users navigate away and return</li> <li>Real-time collaboration where multiple clients need to stay in sync</li> </ul> <p>Streams are maintained across page refreshes, broken connections, and syncing across open tabs and devices.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-improvements">Other improvements</h4><a class="anchor-link" href="#other-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Default JSON schema validator added to MCP client</li> <li><a href="https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/" target="_blank" rel="noopener">Schedules<span class="external-link"> ↗</span></a> can now safely destroy the agent</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-client-api-improvements">MCP client API improvements</h4><a class="anchor-link" href="#mcp-client-api-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>MCPClientManager</code> API has been redesigned for better clarity and control:</p> <ul> <li><strong>New <code>registerServer()</code> method</strong>: Register MCP servers without immediately connecting</li> <li><strong>New <code>connectToServer()</code> method</strong>: Establish connections to registered servers</li> <li><strong>Improved reconnect logic</strong>: <code>restoreConnectionsFromStorage()</code> now properly handles failed connections</li> </ul> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Register a server to Agent</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">id</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.mcp.</span><span class="nb-shiki-1t8gfj">registerServer</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"my-server"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> url: </span><span class="nb-shiki-mdbnqw">"https://my-mcp-server.example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Connect when ready</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.mcp.</span><span class="nb-shiki-1t8gfj">connectToServer</span><span class="nb-shiki-140thh">(id);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Discover tools, prompts and resources</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.mcp.</span><span class="nb-shiki-1t8gfj">discoverIfConnected</span><span class="nb-shiki-140thh">(id);</span></span></code></pre></figure> <p>The SDK now includes a formalized <code>MCPConnectionState</code> enum with states: <code>idle</code>, <code>connecting</code>, <code>authenticating</code>, <code>connected</code>, <code>discovering</code>, and <code>ready</code>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enhanced-mcp-discovery">Enhanced MCP discovery</h4><a class="anchor-link" href="#enhanced-mcp-discovery"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>MCP discovery fetches the available tools, prompts, and resources from an MCP server so your agent knows what capabilities are available. The <code>MCPClientConnection</code> class now includes a dedicated <code>discover()</code> method with improved reliability:</p> <ul> <li>Supports cancellation via AbortController</li> <li>Configurable timeout (default 15s)</li> <li>Discovery failures now throw errors immediately instead of silently continuing</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Fixed a bug where <a href="https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/" target="_blank" rel="noopener">schedules<span class="external-link"> ↗</span></a> meant to fire immediately with this.schedule(0, ...) or <code>this.schedule(new Date(), ...)</code> would not fire</li> <li>Fixed an issue where schedules that took longer than 30 seconds would occasionally time out</li> <li>Fixed SSE transport now properly forwards session IDs and request headers</li> <li>Fixed AI SDK stream events conversion to UIMessageStreamPart</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrade">Upgrade</h4><a class="anchor-link" href="#upgrade"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To update to the latest version:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents@latest</span></span></code></pre></figure>Wed, 26 Nov 2025 00:00:00 GMTAgentsAgentsWorkersAPI Shield - New Zombie API detection for API Shieldhttps://developers.cloudflare.com/changelog/post/2025-11-25-zombie-endpoint-risk-label/https://developers.cloudflare.com/changelog/post/2025-11-25-zombie-endpoint-risk-label/<p>API Shield now automatically detects zombie endpoints — saved endpoints that have not received traffic for an extended period. When detected, the <code>cf-risk-zombie</code> <a href="https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#risk-labels">risk label</a> is applied.</p> <p>The scan runs daily alongside existing risk scans. Endpoints are labeled after 32 days without traffic.</p> <p>Zombie endpoints may indicate deprecated or forgotten API surface area that could pose a security risk. Review these endpoints and consider removing them from Endpoint Management if they are no longer in use. Also consider using a <a href="https://developers.cloudflare.com/api-shield/security/schema-validation/#add-validation-by-adding-a-fallthrough-rule">fallthrough rule</a> to prevent communication with endpoints removed from Endpoint Management.</p>Tue, 25 Nov 2025 00:00:00 GMTAPI ShieldAPI ShieldCache - Audit Logs for Cache Purge Eventshttps://developers.cloudflare.com/changelog/post/2025-11-25-audit-logs-for-cache-purge-events/https://developers.cloudflare.com/changelog/post/2025-11-25-audit-logs-for-cache-purge-events/<p>You can now review detailed audit logs for cache purge events, giving you visibility into what purge requests were sent, what they contained, and by whom. Audit your purge requests via the Dashboard or API for all purge methods:</p> <ul> <li>Purge everything</li> <li>List of prefixes</li> <li>List of tags</li> <li>List of hosts</li> <li>List of files</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example">Example</h4><a class="anchor-link" href="#example"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The detailed audit payload is visible within the Cloudflare Dashboard (under <strong>Manage Account</strong> &gt; <strong>Audit Logs</strong>) and via the API. Below is an example of the Audit Logs v2 payload structure:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "action"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "result"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"success"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"create"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "actor"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"1234567890abcdef"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "email"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"user@example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"user"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "resource"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "product"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"purge_cache"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "request"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "files"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "https://example.com/images/logo.png"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "https://example.com/css/styles.css"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "zone"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"023e105f4ecef8ad9ca31a8372d0c353"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"example.com"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/">Audit Logs documentation</a>.</p>Tue, 25 Nov 2025 00:00:00 GMTCacheCacheWorkers AI - Launching FLUX.2 [dev] on Workers AIhttps://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/https://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/<p>We've partnered with Black Forest Labs (BFL) to bring their latest FLUX.2 [dev] model to Workers AI! This model excels in generating high-fidelity images with physical world grounding, multi-language support, and digital asset creation. You can also create specific super images with granular controls like JSON prompting.</p> <p>Read the <a href="https://bfl.ai/flux2" target="_blank" rel="noopener">BFL blog<span class="external-link"> ↗</span></a> to learn more about the model itself. Read our <a href="https://blog.cloudflare.com/flux-2-workers-ai" target="_blank" rel="noopener">Cloudflare blog<span class="external-link"> ↗</span></a> to see the model in action, or try it out yourself on our <a href="https://multi-modal.ai.cloudflare.com/" target="_blank" rel="noopener">multi modal playground<span class="external-link"> ↗</span></a>.</p> <p>Pricing documentation is available on the <a href="https://developers.cloudflare.com/workers-ai/models/flux-2-dev/">model page</a> or <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing page</a>. Note, we expect to drop pricing in the next few days after iterating on the model performance.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai-platform-specifics">Workers AI Platform specifics</h4><a class="anchor-link" href="#workers-ai-platform-specifics"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The model hosted on Workers AI is able to support up to 4 image inputs (512x512 per input image). Note, this image model is one of the most powerful in the catalog and is expected to be slower than the other image models we currently support. One catch to look out for is that this model takes multipart form data inputs, even if you just have a prompt.</p> <p>With the REST API, the multipart form data input looks like this:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {TOKEN}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: multipart/form-data'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> 'prompt=a sunset at the alps'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --form</span><span class="nb-shiki-mdbnqw"> steps=</span><span class="nb-shiki-dzsirb">25</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> --form</span><span class="nb-shiki-mdbnqw"> width=</span><span class="nb-shiki-dzsirb">1024</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> --form</span><span class="nb-shiki-mdbnqw"> height=</span><span class="nb-shiki-dzsirb">1024</span></span></code></pre></figure> <p>With the Workers AI binding, you can use it as such:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'prompt'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'a sunset with a dog'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'width'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'1024'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'height'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'1024'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">//this dummy request is temporary hack</span></span> <span class="line"><span class="nb-shiki-21nrsd">//we're pushing a change to address this soon</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formRequest</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'http://dummy'</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> method: </span><span class="nb-shiki-mdbnqw">'POST'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> body: form</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formRequest.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formRequest.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">||</span><span class="nb-shiki-mdbnqw"> 'multipart/form-data'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-dev"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: formStream,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: formContentType</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>The parameters you can send to the model are detailed here:</p> <details><p><summary>JSON Schema for Model</summary> <strong>Required Parameters</strong></p><ul> <li><code>prompt</code> (string) - Text description of the image to generate</li> </ul><p><strong>Optional Parameters</strong></p><ul> <li><code>input_image_0</code> (string) - Binary image</li> <li><code>input_image_1</code> (string) - Binary image</li> <li><code>input_image_2</code> (string) - Binary image</li> <li><code>input_image_3</code> (string) - Binary image</li> <li><code>steps</code> (integer) - Number of inference steps. Higher values may improve quality but increase generation time</li> <li><code>guidance</code> (float) - Guidance scale for generation. Higher values follow the prompt more closely</li> <li><code>width</code> (integer) - Width of the image, default <code>1024</code> Range: 256-1920</li> <li><code>height</code> (integer) - Height of the image, default <code>768</code> Range: 256-1920</li> <li><code>seed</code> (integer) - Seed for reproducibility</li> </ul></details> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">## Multi-Reference Images</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">The FLUX.2 model is great at generating images based on reference images. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generate images. You would use it with the same multipart form data structure, with the input images in binary.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">For the prompt, you can reference the images based on the index, like `take the subject of image 1 and style it like image 0` or even use natural language like `place the dog beside the woman`.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">Note: you have to name the input parameter as `input_image_0`, `input_image_1`, `input_image_2` for it to work correctly. All input images must be smaller than 512x512.</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">```bash</span></span> <span class="line"><span class="nb-shiki-wvjl67">curl --request POST \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --url 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --header 'Authorization: Bearer {TOKEN}' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --header 'Content-Type: multipart/form-data' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form 'prompt=take the subject of image 1 and style it like image 0' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form input_image_1=@/Users/johndoe/Desktop/me.png \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form steps=25</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form width=1024</span></span> <span class="line"><span class="nb-shiki-wvjl67"> --form height=1024</span></span></code></pre></figure> <p>Through Workers AI Binding:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">//helper function to convert ReadableStream to Blob</span></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">stream</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">contentType</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Blob</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> reader</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> stream.</span><span class="nb-shiki-1t8gfj">getReader</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> chunks</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [];</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> while</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">done</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">value</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> reader.</span><span class="nb-shiki-1t8gfj">read</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (done) </span><span class="nb-shiki-1itgoe">break</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> chunks.</span><span class="nb-shiki-1t8gfj">push</span><span class="nb-shiki-140thh">(value);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">(chunks, { type: contentType });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"http://image-url"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> form</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> FormData</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob0</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image0.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> image_blob1</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamToBlob</span><span class="nb-shiki-140thh">(image1.body, </span><span class="nb-shiki-mdbnqw">"image/png"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_0'</span><span class="nb-shiki-140thh">, image_blob0)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'input_image_1'</span><span class="nb-shiki-140thh">, image_blob1)</span></span> <span class="line"><span class="nb-shiki-140thh">form.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'prompt'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'take the subject of image 1and style it like image 0'</span><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">//this dummy request is temporary hack</span></span> <span class="line"><span class="nb-shiki-21nrsd">//we're pushing a change to address this soon</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formRequest</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'http://dummy'</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> method: </span><span class="nb-shiki-mdbnqw">'POST'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> body: form</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formRequest.body;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> formContentType</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> formRequest.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'content-type'</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">||</span><span class="nb-shiki-mdbnqw"> 'multipart/form-data'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/black-forest-labs/flux-2-dev"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> multipart: {</span></span> <span class="line"><span class="nb-shiki-140thh"> body: form,</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: </span><span class="nb-shiki-mdbnqw">"multipart/form-data"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">})</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="json-prompting">JSON Prompting</h4><a class="anchor-link" href="#json-prompting"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The model supports prompting in JSON to get more granular control over images. You would pass the JSON as the value of the 'prompt' field in the multipart form data. See the JSON schema below on the base parameters you can pass to the model.</p> <details><summary>JSON Prompting Schema</summary><figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "properties"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "scene"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Overall scene setting or location"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "subjects"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"array"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "items"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "properties"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">, </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Type of subject (e.g., desert nomad, blacksmith, DJ, falcon)"</span><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">, </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Physical attributes, clothing, accessories"</span><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pose"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">, </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Action or stance"</span><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "position"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"foreground"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"midground"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"background"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Depth placement in scene"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "required"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"type"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"description"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"pose"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"position"</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "style"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Artistic rendering style (e.g., digital painting, photorealistic, pixel art, noir sci-fi, lifestyle photo, wabi-sabi photo)"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "color_palette"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"array"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "items"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "minItems"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "maxItems"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Exactly 3 main colors for the scene (e.g., ['navy', 'neon yellow', 'magenta'])"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "lighting"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Lighting condition and direction (e.g., fog-filtered sun, moonlight with star glints, dappled sunlight)"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mood"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Emotional atmosphere (e.g., harsh and determined, playful and modern, peaceful and dreamy)"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "background"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Background environment details"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "composition"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "rule of thirds"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "circular arrangement"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "framed by foreground"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "minimalist negative space"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "S-curve"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "vanishing point center"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "dynamic off-center"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "leading leads"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "golden spiral"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "diagonal energy"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "strong verticals"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "triangular arrangement"</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Compositional technique"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "camera"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "properties"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "angle"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"eye level"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"low angle"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"slightly low"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"bird's-eye"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"worm's-eye"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"over-the-shoulder"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"isometric"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Camera perspective"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "distance"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"close-up"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"medium close-up"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"medium shot"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"medium wide"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"wide shot"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"extreme wide"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Framing distance"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "focus"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"deep focus"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"macro focus"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"selective focus"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"sharp on subject"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"soft background"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Focus type"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "lens"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enum"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"14mm"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"24mm"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"35mm"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"50mm"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"70mm"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"85mm"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Focal length (wide to telephoto)"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "f-number"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh">, </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Aperture (e.g., f/2.8, the smaller the number the more blurry the background)"</span><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ISO"</span><span class="nb-shiki-140thh">: { </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"number"</span><span class="nb-shiki-140thh">, </span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Light sensitivity value (comfortable range between 100 &amp; 6400, lower = less sensitivity)"</span><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "effects"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"array"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "items"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Post-processing effects (e.g., 'lens flare small', 'subtle film grain', 'soft bloom', 'god rays', 'chromatic aberration mild')"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "required"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"scene"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"subjects"</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></details> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-features-to-try">Other features to try</h4><a class="anchor-link" href="#other-features-to-try"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>The model also supports the most common latin and non-latin character languages</li> <li>You can prompt the model with specific hex codes like <code>#2ECC71</code></li> <li>Try creating digital assets like landing pages, comic strips, infographics too!</li> </ul>Tue, 25 Nov 2025 00:00:00 GMTWorkers AIWorkers AIRadar - Cloud Services Observability in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-11-24-radar-cloud-observability/https://developers.cloudflare.com/changelog/post/2025-11-24-radar-cloud-observability/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> introduces HTTP Origins insights, providing visibility into the status of traffic between Cloudflare's global network and cloud-based origin infrastructure.</p> <p>The new <a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/"><code>Origins</code></a> API provides provides the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/list/"><code>/origins</code></a> - Lists all origins (cloud providers and associated regions).</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/get/"><code>/origins/{origin}</code></a> - Retrieves information about a specific origin (cloud provider).</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/timeseries/"><code>/origins/timeseries</code></a> - Retrieves normalized time series data for a specific origin, including the following metrics: <ul> <li><code>REQUESTS</code>: Number of requests</li> <li><code>CONNECTION_FAILURES</code>: Number of connection failures</li> <li><code>RESPONSE_HEADER_RECEIVE_DURATION</code>: Duration of the response header receive</li> <li><code>TCP_HANDSHAKE_DURATION</code>: Duration of the TCP handshake</li> <li><code>TCP_RTT</code>: TCP round trip time</li> <li><code>TLS_HANDSHAKE_DURATION</code>: Duration of the TLS handshake</li> </ul> </li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/summary/"><code>/origins/summary</code></a> - Retrieves HTTP requests to origins summarized by a dimension.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/timeseries_groups/"><code>/origins/timeseries_groups</code></a> - Retrieves timeseries data for HTTP requests to origins grouped by a dimension.</li> </ul> <p>The following dimensions are available for the <code>summary</code> and <code>timeseries_groups</code> endpoints:</p> <ul> <li><code>region</code>: Origin region</li> <li><code>success_rate</code>: Success rate of requests (2XX versus 5XX response codes)</li> <li><code>percentile</code>: Percentiles of metrics listed above</li> </ul> <p>Additionally, the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/annotations/"><code>Annotations</code></a> and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/traffic_anomalies/"><code>Traffic Anomalies</code></a> APIs have been extended to support origin outages and anomalies, enabling automated detection and alerting for origin infrastructure issues.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=970,format=webp/_astro/cloud-service-status.DoGHSNmz.png" alt="Screenshot of the cloud service status heatmap" loading="lazy" decoding="async" width="1600" height="970"> <p>Check out the <a href="https://radar.cloudflare.com/cloud-observatory" target="_blank" rel="noopener">new Radar page<span class="external-link"> ↗</span></a>.</p>Mon, 24 Nov 2025 00:00:00 GMTRadarRadarWAF - WAF Release - 2025-11-24https://developers.cloudflare.com/changelog/post/2025-11-24-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-24-waf-release/ <p>This week highlights enhancements to detection signatures improving coverage for vulnerabilities in FortiWeb, linked to CVE-2025-64446, alongside new detection logic expanding protection against PHP Wrapper Injection techniques.</p> <p><strong>Key Findings</strong></p> <p>This vulnerability enables an unauthenticated attacker to bypass access controls by abusing the <code>CGIINFO</code> header. The latest update strengthens detection logic to ensure a reliable identification of crafted requests attempting to exploit this flaw.</p> <p><strong>Impact</strong></p> <ul> <li>FortiWeb (CVE-2025-64446): Exploitation allows a remote unauthenticated adversary to circumvent authentication mechanisms by sending a manipulated <code>CGIINFO</code> header to FortiWeb’s backend CGI handler. Successful exploitation grants unintended access to restricted administrative functionality, potentially enabling configuration tampering or system-level actions.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b957ace6e9844bf29244401c4e2e1a2e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4e2e1a2e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>FortiWeb - Authentication Bypass via CGIINFO Header - CVE:CVE-2025-64446</td><td>Log</td><td>Block</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e3871391a93248fa98a78e03b6c44ed5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b6c44ed5</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection - Body - Beta</td><td>Log</td><td>Disabled</td><td>This rule has been merged into the original rule "PHP Wrapper Injection - Body" (ID:<rule-id id="fae6fa37ae9249d58628e54b1a3e521e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1a3e521e</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e6b1b66e0e3b46969102baed900f4015"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...900f4015</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection - URI - Beta</td><td>Log</td><td>Disabled</td><td>This rule has been merged into the original rule "PHP Wrapper Injection - URI" (ID:<rule-id id="9c02e585db34440da620eb668f76bd74"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8f76bd74</span></button></rule-id>)</td></tr></tbody></table>Mon, 24 Nov 2025 00:00:00 GMTWAFWAFContainers, R2 - Mount R2 buckets in Containershttps://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/https://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/<p><a href="https://developers.cloudflare.com/containers/">Containers</a> now support mounting R2 buckets as FUSE (Filesystem in Userspace) volumes, allowing applications to interact with <a href="https://developers.cloudflare.com/r2/">R2</a> using standard filesystem operations.</p> <p>Common use cases include:</p> <ul> <li>Bootstrapping containers with datasets, models, or dependencies for <a href="https://developers.cloudflare.com/sandbox/">sandboxes</a> and <a href="https://developers.cloudflare.com/agents/">agent</a> environments</li> <li>Persisting user configuration or application state without managing downloads</li> <li>Accessing large static files without bloating container images or downloading at startup</li> </ul> <p>FUSE adapters like <a href="https://github.com/tigrisdata/tigrisfs" target="_blank" rel="noopener">tigrisfs<span class="external-link"> ↗</span></a>, <a href="https://github.com/s3fs-fuse/s3fs-fuse" target="_blank" rel="noopener">s3fs<span class="external-link"> ↗</span></a>, and <a href="https://github.com/GoogleCloudPlatform/gcsfuse" target="_blank" rel="noopener">gcsfuse<span class="external-link"> ↗</span></a> can be installed in your container image and configured to mount buckets at startup.</p> <figure class="nb-code-figure" data-nb-lang="dockerfile"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="dockerfile" data-nb-lang="dockerfile"><code><span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> alpine:3.20</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Install FUSE and dependencies</span></span> <span class="line"><span class="nb-shiki-1itgoe">RUN</span><span class="nb-shiki-140thh"> apk update &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> apk add --no-cache ca-certificates fuse curl bash</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Install tigrisfs</span></span> <span class="line"><span class="nb-shiki-1itgoe">RUN</span><span class="nb-shiki-140thh"> ARCH=$(uname -m) &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> if [ </span><span class="nb-shiki-mdbnqw">"$ARCH"</span><span class="nb-shiki-140thh"> = </span><span class="nb-shiki-mdbnqw">"x86_64"</span><span class="nb-shiki-140thh"> ]; then ARCH=</span><span class="nb-shiki-mdbnqw">"amd64"</span><span class="nb-shiki-140thh">; fi &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> if [ </span><span class="nb-shiki-mdbnqw">"$ARCH"</span><span class="nb-shiki-140thh"> = </span><span class="nb-shiki-mdbnqw">"aarch64"</span><span class="nb-shiki-140thh"> ]; then ARCH=</span><span class="nb-shiki-mdbnqw">"arm64"</span><span class="nb-shiki-140thh">; fi &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o </span><span class="nb-shiki-mdbnqw">'"tag_name": "[^"]*'</span><span class="nb-shiki-140thh"> | cut -d</span><span class="nb-shiki-mdbnqw">'"'</span><span class="nb-shiki-140thh"> -f4) &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> curl -L </span><span class="nb-shiki-mdbnqw">"https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz"</span><span class="nb-shiki-140thh"> -o /tmp/tigrisfs.tar.gz &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> tar -xzf /tmp/tigrisfs.tar.gz -C /usr/local/bin/ &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> rm /tmp/tigrisfs.tar.gz &amp;&amp; \</span></span> <span class="line"><span class="nb-shiki-140thh"> chmod +x /usr/local/bin/tigrisfs</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Create startup script that mounts bucket</span></span> <span class="line"><span class="nb-shiki-1itgoe">RUN</span><span class="nb-shiki-140thh"> printf </span><span class="nb-shiki-mdbnqw">'#!/bin/sh</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> set -e</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> mkdir -p /mnt/r2</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> R2_ENDPOINT="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> /usr/local/bin/tigrisfs --endpoint "${R2_ENDPOINT}" -f "${BUCKET_NAME}" /mnt/r2 &amp;</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> sleep 3</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ls -lah /mnt/r2</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">\</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> '</span><span class="nb-shiki-140thh"> &gt; /startup.sh &amp;&amp; chmod +x /startup.sh</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">CMD</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-mdbnqw">"/startup.sh"</span><span class="nb-shiki-140thh">]</span></span></code></pre></figure> <p>See the <a href="https://developers.cloudflare.com/containers/examples/r2-fuse-mount/">Mount R2 buckets with FUSE</a> example for a complete guide on mounting R2 buckets and/or other S3-compatible storage buckets within your containers.</p>Fri, 21 Nov 2025 00:00:00 GMTContainersContainersR2Containers - New CPU Pricing for Containers and Sandboxeshttps://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/<p><a href="https://developers.cloudflare.com/containers/">Containers</a> and <a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a> pricing for CPU time is now based on active usage only, instead of provisioned resources.</p> <p>This means that you now pay less for Containers and Sandboxes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="an-example-before-and-after">An Example Before and After</h4><a class="anchor-link" href="#an-example-before-and-after"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Imagine running the <code>standard-2</code> instance type for one hour, which can use up to 1 vCPU, but on average you use only 20% of your CPU capacity.</p> <p>CPU-time is priced at <em>$0.00002 per vCPU-second</em>.</p> <p>Previously, you would be charged for the CPU allocated to the instance multiplied by the time it was active, in this case 1 hour.</p> <p>CPU cost would have been: <strong>$0.072</strong> — 1 vCPU * 3600 seconds * $0.00002</p> <p>Now, since you are only using 20% of your CPU capacity, your CPU cost is cut to 20% of the previous amount.</p> <p>CPU cost is now: <strong>$0.0144</strong> — 1 vCPU * 3600 seconds * $0.00002 * 20% utilization</p> <p>This can significantly reduce costs for Containers and Sandboxes.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Memory cost and disk pricing remain unchanged, and is still calculated based on <em>provisioned</em> resources.</p></div></div></aside> <p>See the documentation to learn more about <a href="https://developers.cloudflare.com/containers/get-started/">Containers</a>, <a href="https://developers.cloudflare.com/sandbox/">Sandboxes</a>, and <a href="https://developers.cloudflare.com/containers/pricing">associated pricing</a>.</p>Fri, 21 Nov 2025 00:00:00 GMTContainersContainersSecurity Center - Threat insights are now available in the Threat Events platformhttps://developers.cloudflare.com/changelog/post/2025-11-21-Threat-Events-now-show-events-insights/https://developers.cloudflare.com/changelog/post/2025-11-21-Threat-Events-now-show-events-insights/<p>The threat events platform now has threat insights available for some relevant parent events. Threat intelligence analyst users can access these insights for their threat hunting activity. Insights are also highlighted in the Cloudflare dashboard by a small <code>lightning icon</code> and the insights can refer to multiple, connected events, potentially part of the same attack or campaign and associated with the same threat actor.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/security-center/cloudforce-one/#analyze-threat-events">Analyze threat events</a>.</p>Fri, 21 Nov 2025 00:00:00 GMTSecurity CenterSecurity CenterWAF - WAF Release - 2025-11-21https://developers.cloudflare.com/changelog/post/2025-11-21-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-21-emergency-waf-release/ <p>This week’s release introduces a critical detection for CVE-2025-61757, a vulnerability in the Oracle Identity Manager REST WebServices component.</p> <p><strong>Key Findings</strong></p> <p>This flaw allows unauthenticated attackers with network access over HTTP to fully compromise the Identity Manager, potentially leading to a complete takeover.</p> <p><strong>Impact</strong></p> <p>Oracle Identity Manager (CVE-2025-61757): Exploitation could allow an unauthenticated remote attacker to bypass security checks by sending specially crafted requests to the application's message processor. This enables the creation of arbitrary employee accounts, which can be leveraged to modify system configurations and achieve full system compromise.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fa584616fe2241608cb8bd1339fdbe7e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...39fdbe7e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Oracle Identity Manager - Pre-Auth RCE - CVE:CVE-2025-61757</td><td>N/A</td><td>Block</td><td>This is a new detection.</td></tr></tbody></table>Fri, 21 Nov 2025 00:00:00 GMTWAFWAFWorkers - Environment variable limits increase for Workers Buildshttps://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/https://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/<p><a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a> now supports up to 64 environment variables, and each environment variable can be up to 5 KB in size. The previous limit was 5 KB total across all environment variables.</p> <p>This change enables better support for complex build configurations, larger application settings, and more flexible CI/CD workflows.</p> <p>For more details, refer to the <a href="https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/#definitions">build limits documentation</a>.</p>Fri, 21 Nov 2025 00:00:00 GMTWorkersWorkersWorkers - Better local deployment flow for Cloudflare Workershttps://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/https://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/ <p>Until now, if a Worker had been previously deployed via the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare Dashboard<span class="external-link"> ↗</span></a>, a subsequent deployment done via the Cloudflare Workers CLI, <a href="https://developers.cloudflare.com/workers/wrangler/"><strong>Wrangler</strong></a> (through the <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy"><code>deploy</code> command</a>), would allow the user to override the Worker's dashboard settings without providing details on what dashboard settings would be lost.</p> <p>Now instead, <code>wrangler deploy</code> presents a helpful representation of the differences between the <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">local configuration</a> and the remote dashboard settings, and offers to update your local configuration file for you.</p> <p>See example below showing a before and after for <code>wrangler deploy</code> when a local configuration is expected to override a Worker's dashboard settings:</p> <article class="bg-card ring-border my-4 rounded-lg p-5 shadow-sm ring"><h3 class="text-foreground m-0 mb-1.5 text-base leading-snug font-semibold">Before</h3><div class="text-sm leading-normal text-muted-foreground"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=785,height=257,format=webp/_astro/before.Bz-MOePT.png" alt="wrangler deploy run before the improved workflow" loading="lazy" decoding="async" width="785" height="257"></div></article><article class="bg-card ring-border my-4 rounded-lg p-5 shadow-sm ring"><h3 class="text-foreground m-0 mb-1.5 text-base leading-snug font-semibold">After</h3><div class="text-sm leading-normal text-muted-foreground"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=788,height=492,format=webp/_astro/after.BrkkBaRL.png" alt="wrangler deploy run after the improved workflow" loading="lazy" decoding="async" width="788" height="492"></div></article> <p>Also, if instead Wrangler detects that a deployment would override remote dashboard settings but in an additive way, without modifying or removing any of them, it will simply proceed with the deployment without requesting any user interaction.</p> <p>Update to <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> v4.50.0 or greater to take advantage of this improved deploy flow.</p>Fri, 21 Nov 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Terraform - Terraform v5.13.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-11-20-terraform-v5.13.0-provider/https://developers.cloudflare.com/changelog/post/2025-11-20-terraform-v5.13.0-provider/<p>Earlier this year, we announced the launch of the new Terraform v5 Provider. We are aware of the high number of issues reported by the Cloudflare community related to the v5 release. We have committed to releasing improvements on a <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774" target="_blank" rel="noopener">2-3 week cadence<span class="external-link"> ↗</span></a> to ensure its stability and reliability, including the v5.13 release. We have also pivoted from an <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237" target="_blank" rel="noopener">issue-to-issue approach to a resource-per-resource approach<span class="external-link"> ↗</span></a> - we will be focusing on specific resources to not only stabilize the resource but also ensure it is migration-friendly for those migrating from v4 to v5.</p> <p>Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.</p> <p>This release includes new features, new resources and data sources, bug fixes, updates to our Developer Documentation, and more.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="breaking-change">Breaking Change</h4><a class="anchor-link" href="#breaking-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Please be aware that there are breaking changes for the <code>cloudflare_api_token</code> and <code>cloudflare_account_token</code> resources. These changes eliminate configuration drift caused by policy ordering differences in the Cloudflare API.</p> <p>For more specific information about the changes or the actions required, please see the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.13.0" target="_blank" rel="noopener">detailed Repository changelog<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="features">Features</h4><a class="anchor-link" href="#features"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>New resources and data sources added</strong> <ul> <li>cloudflare_connectivity_directory</li> <li>cloudflare_sso_connector</li> <li>cloudflare_universal_ssl_setting</li> </ul> </li> <li><strong>api_token+account_tokens:</strong> state upgrader and schema bump (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6472" target="_blank" rel="noopener">#6472<span class="external-link"> ↗</span></a>)</li> <li><strong>docs:</strong> make docs explicit when a resource does not have import support</li> <li><strong>magic_transit_connector:</strong> support self-serve license key (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6398" target="_blank" rel="noopener">#6398<span class="external-link"> ↗</span></a>)</li> <li><strong>worker_version:</strong> add content_base64 support</li> <li><strong>worker_version:</strong> boolean support for run_worker_first (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6407" target="_blank" rel="noopener">#6407<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_script_subdomains:</strong> add import support (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6375" target="_blank" rel="noopener">#6375<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_access_application:</strong> add proxy_endpoint for ZT Access Application (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6453" target="_blank" rel="noopener">#6453<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dlp_predefined_profile:</strong> Switch DLP Predefined Profile endpoints, introduce enabled_entries attribute</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="bug-fixes">Bug Fixes</h4><a class="anchor-link" href="#bug-fixes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>account_token:</strong> token policy order and nested resources (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6440" target="_blank" rel="noopener">#6440<span class="external-link"> ↗</span></a>)</li> <li>allow r2_bucket_event_notification to be applied twice without failing (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6419" target="_blank" rel="noopener">#6419<span class="external-link"> ↗</span></a>)</li> <li><strong>cloudflare_worker+cloudflare_worker_version:</strong> import for the resources (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6357" target="_blank" rel="noopener">#6357<span class="external-link"> ↗</span></a>)</li> <li><strong>dns_record:</strong> inconsistent apply error (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6452" target="_blank" rel="noopener">#6452<span class="external-link"> ↗</span></a>)</li> <li><strong>pages_domain:</strong> resource tests (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6338" target="_blank" rel="noopener">#6338<span class="external-link"> ↗</span></a>)</li> <li><strong>pages_project:</strong> unintended resource state drift (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6377" target="_blank" rel="noopener">#6377<span class="external-link"> ↗</span></a>)</li> <li><strong>queue_consumer:</strong> id population (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6181" target="_blank" rel="noopener">#6181<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_kv:</strong> multipart request (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6367" target="_blank" rel="noopener">#6367<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_kv:</strong> updating workers metadata attribute to be read from endpoint (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6386" target="_blank" rel="noopener">#6386<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_script_subdomain:</strong> add note to cloudflare_workers_script_subdomain about redundancy with cloudflare_worker (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6383" target="_blank" rel="noopener">#6383<span class="external-link"> ↗</span></a>)</li> <li><strong>workers_script:</strong> allow config.run_worker_first to accept list input</li> <li><strong>zero_trust_device_custom_profile_local_domain_fallback:</strong> drift issues (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6365" target="_blank" rel="noopener">#6365<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_device_custom_profile:</strong> resolve drift issues (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6364" target="_blank" rel="noopener">#6364<span class="external-link"> ↗</span></a>)</li> <li><strong>zero_trust_dex_test:</strong> correct configurability for 'targeted' attribute to fix drift</li> <li><strong>zero_trust_tunnel_cloudflared_config:</strong> remove warp_routing from cloudflared_config (<a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/6471" target="_blank" rel="noopener">#6471<span class="external-link"> ↗</span></a>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest holding off on migration to v5 while we work on stabilization. This help will you avoid any blocking issues while the Terraform resources are actively being stabilized. We will be releasing a new migration tool in March 2026 to help support v4 to v5 transitions for our most popular resources.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform Provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/" target="_blank" rel="noopener">Documentation on using Terraform with Cloudflare<span class="external-link"> ↗</span></a></li> </ul>Thu, 20 Nov 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformAI Search - AI Search support for crawling login protected website contenthttps://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/https://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/authentication-headers/">custom HTTP headers</a> for website crawling, solving a common problem where valuable content behind authentication or access controls could not be indexed.</p> <p>Previously, AI Search could only crawl publicly accessible pages, leaving knowledge bases, documentation, and other protected content out of your search results. With custom headers support, you can now include authentication credentials that allow the crawler to access this protected content.</p> <p>This is particularly useful for indexing content like:</p> <ul> <li><strong>Internal documentation</strong> behind corporate login systems</li> <li><strong>Premium content</strong> that requires users to provide access to unlock</li> <li><strong>Sites protected by Cloudflare Access</strong> using service tokens</li> </ul> <p>To add custom headers when creating an AI Search instance, select <strong>Parse options</strong>. In the <strong>Extra headers</strong> section, you can add up to five custom headers per Website data source.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1098,height=287,format=webp/_astro/ai-search-extra-headers.B7A2spby.png" alt="Custom headers configuration in AI Search" loading="lazy" decoding="async" width="1098" height="287"> <p>For example, to crawl a site protected by <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/">Cloudflare Access</a>, you can add service token credentials as custom headers:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">CF-Access-Client-Id: your-token-id.access</span></span> <span class="line"><span class="nb-shiki-wvjl67">CF-Access-Client-Secret: your-token-secret</span></span></code></pre></figure> <p>The crawler will automatically include these headers in all requests, allowing it to access protected pages that would otherwise be blocked.</p> <p>Learn more about <a href="https://developers.cloudflare.com/ai-search/configuration/data-source/website/authentication-headers/">configuring custom headers for website crawling</a> in AI Search.</p>Wed, 19 Nov 2025 00:00:00 GMTAI SearchAI SearchEmail security - Adjustment to Final Disposition Columnhttps://developers.cloudflare.com/changelog/post/2025-11-18-temporary-adjustment-to-final-disposition-column/https://developers.cloudflare.com/changelog/post/2025-11-18-temporary-adjustment-to-final-disposition-column/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="adjustment-to-final-disposition-column">Adjustment to Final Disposition column</h4><a class="anchor-link" href="#adjustment-to-final-disposition-column"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="the-final-disposition-column-in-submissions--team-submissions-tab-is-changing-for-non-phishguard-customers">The <strong>Final Disposition</strong> column in <strong>Submissions</strong> &gt; <strong>Team Submissions</strong> tab is changing for non-Phishguard customers.</h4><a class="anchor-link" href="#the-final-disposition-column-in-submissions--team-submissions-tab-is-changing-for-non-phishguard-customers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-changing">What's Changing</h4><a class="anchor-link" href="#whats-changing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Column will be called <strong>Status</strong> instead of <strong>Final Disposition</strong></li> <li>Column status values will now be: <strong>Submitted</strong>, <strong>Accepted</strong> or <strong>Rejected</strong>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="next-steps">Next Steps</h4><a class="anchor-link" href="#next-steps"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We will listen carefully to your feedback and continue to find comprehensive ways to communicate updates on your submissions. Your submissions will continue to be addressed at an even greater rate than before, fuelling faster and more accurate email security improvement.</p>Tue, 18 Nov 2025 00:00:00 GMTEmail securityEmail securityCloudflare One - New Cloudflare One Navigation and Product Experiencehttps://developers.cloudflare.com/changelog/post/new-cloudflare-one-navigation-and-product-experience/https://developers.cloudflare.com/changelog/post/new-cloudflare-one-navigation-and-product-experience/<p>The Zero Trust dashboard and navigation is receiving significant and exciting updates. The dashboard is being restructured to better support common tasks and workflows, and various pages have been moved and consolidated.</p> <p>There is a new guided experience on login detailing the changes, and you can use the Zero Trust dashboard search to find product pages by both their new and old names, as well as your created resources. To replay the guided experience, you can find it in Overview &gt; Get Started.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1388,height=1546,format=webp/_astro/cf1-dash-changes.Uk_Y-2V-.png" alt="Cloudflare One Dash Changes" loading="lazy" decoding="async" width="1388" height="1546"> <p>Notable changes</p> <ul> <li>Product names have been removed from many top-level navigation items to help bring clarity to what they help you accomplish. For example, you can find Gateway policies under ‘Traffic policies' and CASB findings under ‘Cloud &amp; SaaS findings.'</li> <li>You can view all analytics, logs, and real-time monitoring tools from ‘Insights.'</li> <li>‘Networks' better maps the ways that your corporate network interacts with Cloudflare. Some pages like Tunnels, are now a tab rather than a full page as part of these changes. You can find them at Networks &gt; Connectors.</li> <li>Settings are now located closer to the tools and resources they impact. For example, this means you'll find your WARP configurations at Team &amp; Resources &gt; Devices.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=514,height=1112,format=webp/_astro/new-cf1-navigation.B7-E-9CV.png" alt="New Cloudflare One Navigation" loading="lazy" decoding="async" width="514" height="1112"> <p>No changes to our API endpoint structure or to any backend services have been made as part of this effort.</p>Mon, 17 Nov 2025 00:00:00 GMTCloudflare OneCloudflare OneWAF - WAF Release - 2025-11-17https://developers.cloudflare.com/changelog/post/2025-11-17-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-17-waf-release/ <p>This week highlights enhancements to detection signatures improving coverage for vulnerabilities in DELMIA Apriso, linked to CVE-2025-6205.</p> <p><strong>Key Findings</strong></p> <p>This vulnerability allows unauthenticated attackers to gain privileged access to the application. The latest update provides enhanced detection logic for resilient protection against exploitation attempts.</p> <p><strong>Impact</strong></p> <ul> <li>DELMIA Apriso (CVE-2025-6205): Exploitation could allow an unauthenticated remote attacker to bypass security checks by sending specially crafted requests to the application's message processor. This enables the creation of arbitrary employee accounts, which can be leveraged to modify system configurations and achieve full system compromise.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ec1e2aa190e64e7cb468e16dd256f4bc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d256f4bc</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>DELMIA Apriso - Auth Bypass - CVE:CVE-2025-6205</td><td>Log</td><td>Block</td><td>This is a new detection.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fae6fa37ae9249d58628e54b1a3e521e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1a3e521e</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection - Body</td><td>N/A</td><td>Disabled</td><td>Rule metadata description refined. Detection unchanged.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9c02e585db34440da620eb668f76bd74"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8f76bd74</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection - URI</td><td>N/A</td><td>Disabled</td><td>Rule metadata description refined. Detection unchanged.</td></tr></tbody></table>Mon, 17 Nov 2025 00:00:00 GMTWAFWAFAccess - Generate Cloudflare Access SSH certificate authority (CA) directly from the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-11-14-SSH-CA-enhancements/https://developers.cloudflare.com/changelog/post/2025-11-14-SSH-CA-enhancements/<p>SSH with <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/">Cloudflare Access for Infrastructure</a> allows you to use short-lived SSH certificates to eliminate SSH key management and reduce security risks associated with lost or stolen keys.</p> <p>Previously, users had to generate this certificate by using the <a href="https://developers.cloudflare.com/api/" target="_blank" rel="noopener">Cloudflare API<span class="external-link"> ↗</span></a> directly. With this update, you can now create and manage this certificate in the <a href="https://one.dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare One dashboard<span class="external-link"> ↗</span></a> from the <strong>Access controls</strong> &gt; <strong>Service credentials</strong> page.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2710,height=1180,format=webp/_astro/SSH-CA-generation.DYa9RnX1.png" alt="Navigate to Access controls and then Service credentials to see where you can generate an SSH CA" loading="lazy" decoding="async" width="2710" height="1180"> <p>For more details, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/#generate-a-cloudflare-ssh-ca">Generate a Cloudflare SSH CA</a>.</p>Fri, 14 Nov 2025 00:00:00 GMTAccessAccessCASB - New SaaS Security weekly digests with API CASBhttps://developers.cloudflare.com/changelog/post/2025-11-14-casb-digest/https://developers.cloudflare.com/changelog/post/2025-11-14-casb-digest/<p>You can now stay on top of your SaaS security posture with the new <strong>CASB Weekly Digest</strong> notification. This opt-in email digest is delivered to your inbox every Monday morning and provides a high-level summary of your organization's Cloudflare API CASB findings from the previous week.</p> <p>This allows security teams and IT administrators to get proactive, at-a-glance visibility into new risks and integration health without having to log in to the dashboard.</p> <p>To opt in, navigate to <strong>Manage Account</strong> &gt; <strong>Notifications</strong> in the Cloudflare dashboard to configure the <strong>CASB Weekly Digest</strong> alert type.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>At-a-glance summary</strong> — Review new high/critical findings, most frequent finding types, and new content exposures from the past 7 days.</li> <li><strong>Integration health</strong> — Instantly see the status of all your connected SaaS integrations (Healthy, Unhealthy, or Paused) to spot API connection issues.</li> <li><strong>Proactive alerting</strong> — The digest is sent automatically to all subscribed users every Monday morning.</li> <li><strong>Easy to configure</strong> — Users can opt in by enabling the notification in the Cloudflare dashboard under <strong>Manage Account</strong> &gt; <strong>Notifications</strong>.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Configure <a href="https://developers.cloudflare.com/notifications/">notification preferences</a> in Cloudflare.</li> </ul> <p>The CASB Weekly Digest notification is available to all Cloudflare users today.</p>Fri, 14 Nov 2025 00:00:00 GMTCASBCASBLog Explorer - Fixed custom SQL date picker inconsistencieshttps://developers.cloudflare.com/changelog/post/2025-11-13-fixed-custom-date/https://developers.cloudflare.com/changelog/post/2025-11-13-fixed-custom-date/<p>We've resolved a bug in Log Explorer that caused inconsistencies between the custom SQL date field filters and the date picker dropdown. Previously, users attempting to filter logs based on a custom date field via a SQL query sometimes encountered unexpected results or mismatching dates when using the interactive date picker.</p> <p>This fix ensures that the custom SQL date field filters now align correctly with the selection made in the date picker dropdown, providing a reliable and predictable filtering experience for your log data. This is particularly important for users creating custom log views based on time-sensitive fields.</p>Thu, 13 Nov 2025 00:00:00 GMTLog ExplorerLog ExplorerLog Explorer - Log Explorer adds 14 new datasetshttps://developers.cloudflare.com/changelog/post/2025-11-13-new-datasets/https://developers.cloudflare.com/changelog/post/2025-11-13-new-datasets/<p>We've significantly enhanced Log Explorer by adding support for 14 additional Cloudflare product datasets.</p> <p>This expansion enables Operations and Security Engineers to gain deeper visibility and telemetry across a wider range of Cloudflare services. By integrating these new datasets, users can now access full context to efficiently investigate security incidents, troubleshoot application performance issues, and correlate logged events across different layers (like application and network) within a single interface. This capability is crucial for a complete and cohesive understanding of event flows across your Cloudflare environment.</p> <p>The newly supported datasets include:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="zone-level">Zone Level</h4><a class="anchor-link" href="#zone-level"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>Dns_logs</code></li> <li><code>Nel_reports</code></li> <li><code>Page_shield_events</code></li> <li><code>Spectrum_events</code></li> <li><code>Zaraz_events</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="account-level">Account Level</h4><a class="anchor-link" href="#account-level"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>Audit Logs</code></li> <li><code>Audit_logs_v2</code></li> <li><code>Biso_user_actions</code></li> <li><code>DNS firewall logs</code></li> <li><code>Email_security_alerts</code></li> <li><code>Magic Firewall IDS</code></li> <li><code>Network Analytics</code></li> <li><code>Sinkhole HTTP</code></li> <li><code>ipsec_logs</code></li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p><code>Auditlog</code> and <code>Auditlog_v2</code> datasets require <code>audit-log.read</code> permission for querying.</p><p>The <code>biso_user_actions</code> dataset requires either the <code>Super Admin</code> or <code>ZT PII</code> role for querying.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-correlating-logs">Example: Correlating logs</h4><a class="anchor-link" href="#example-correlating-logs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now use Log Explorer to query and filter with each of these datasets. For example, you can identify an IP address exhibiting suspicious behavior in the <code>FW_event</code> logs, and then instantly pivot to the <code>Network Analytics</code> logs or <code>Access</code> logs to see its network-level traffic profile or if it bypassed a corporate policy.</p> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/log-explorer/">Log Explorer documentation</a> and the <a href="https://developers.cloudflare.com/logs/">Cloudflare Logs documentation</a>.</p>Thu, 13 Nov 2025 00:00:00 GMTLog ExplorerLog ExplorerAPI Shield - New BOLA Vulnerability Detection for API Shieldhttps://developers.cloudflare.com/changelog/post/2025-11-12-bola-attack-detection/https://developers.cloudflare.com/changelog/post/2025-11-12-bola-attack-detection/<p>Now, API Shield automatically searches for and highlights <strong>Broken Object Level Authorization (BOLA) attacks</strong> on managed API endpoints. API Shield will highlight both BOLA enumeration attacks and BOLA pollution attacks, telling you what was attacked, by who, and for how long.</p> <p>You can find these attacks three different ways: Security Overview, Endpoint details, or Security Analytics. If these attacks are not found on your managed API endpoints, there will not be an overview card or security analytics suspicious activity card.</p> <p>On the Security Overview card, select the suggestion &gt; <strong>View details</strong> to review the top attacked API endpoints, endpoint details, and the attack summary: <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1546,height=816,format=webp/_astro/bola-overview-card.hwcSeAkb.png" alt="BOLA attack Overview card" loading="lazy" decoding="async" width="1546" height="816"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1246,height=1078,format=webp/_astro/bola-overview-drawer.DD2c0bxS.png" alt="BOLA attack Overview drawer" loading="lazy" decoding="async" width="1246" height="1078"></p> <p>From the endpoint details, you can select <strong>View attack</strong> to find details about the BOLA attacker’s sessions.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2050,height=630,format=webp/_astro/bola-endpoint-attack.UQP3MDkp.png" alt="BOLA attack endpoint details" loading="lazy" decoding="async" width="2050" height="630"> <p>From here, select <strong>View in Analytics</strong> to observe attacker traffic over time for the last seven days.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1156,height=1176,format=webp/_astro/bola-analytics-drawer.DXzC6EJU.png" alt="BOLA attack analytics drawer" loading="lazy" decoding="async" width="1156" height="1176"> <p>Your search will filter to traffic on that endpoint in the last seven days, along with the malicious session IDs found in the attack. Session IDs are hashed for privacy and will not be found in your origin logs. Refer to IP and JA4 fingerprint to cross-reference behavior at the origin.</p> <p>At any time, you can also start your investigation into attack traffic from Security Analytics by selecting the suspicious activity card.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1252,height=722,format=webp/_astro/bola-suspicious-card._B3GB3s4.png" alt="Suspicious Activity card" loading="lazy" decoding="async" width="1252" height="722"> <p>We urge you to take all of this client information to your developer team to research the attacker behavior and ensure any broken authorization policies in your API are fixed at the source in your application, preventing further abuse.</p> <p>In addition, this release marks the end of the beta period for these scans. All Enterprise customers with API Shield subscriptions will see these new attacks if found on their zone.</p>Wed, 12 Nov 2025 00:00:00 GMTAPI ShieldAPI ShieldDigital Experience Monitoring - DEX Logpush jobshttps://developers.cloudflare.com/changelog/post/2025-11-12-dex-logpush-jobs/https://developers.cloudflare.com/changelog/post/2025-11-12-dex-logpush-jobs/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience Monitoring (DEX)</a> provides visibility into WARP device metrics, connectivity, and network performance across your Cloudflare SASE deployment.</p> <p>We've released four new WARP and DEX device data sets that can be exported via <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/">Cloudflare Logpush</a>. These Logpush data sets can be exported to R2, a cloud bucket, or a SIEM to build a customized logging and analytics experience.</p> <ol> <li><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/dex_application_tests/">DEX Application Tests</a></li> <li><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/dex_device_state_events/">DEX Device State Events</a></li> <li><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/warp_config_changes/">WARP Config Changes</a></li> <li><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/warp_toggle_changes/">WARP Toggle Changes</a></li> </ol> <p>To create a new DEX or WARP Logpush job, customers can go to the account level of the Cloudflare dashboard &gt; Analytics &amp; Logs &gt; Logpush to get started.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2549,height=1283,format=webp/_astro/dex_logpush_datasets.CtCk36pX.png" alt="DEX logpush job creation dashboard" loading="lazy" decoding="async" width="2549" height="1283">Wed, 12 Nov 2025 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringWorkers Analytics Engine, Workers - More SQL aggregate, date and time functions available in Workers Analytics Enginehttps://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/https://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/<p>You can now perform more powerful queries directly in <a href="https://developers.cloudflare.com/analytics/analytics-engine/" target="_blank" rel="noopener">Workers Analytics Engine<span class="external-link"> ↗</span></a> with a major expansion of our SQL function library.</p> <p>Workers Analytics Engine allows you to ingest and store high-cardinality data at scale (such as custom analytics) and query your data through a simple SQL API.</p> <p>Today, we've expanded Workers Analytics Engine's SQL capabilities with several new functions:</p> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/" target="_blank" rel="noopener"><strong>New aggregate functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>countIf()</code> - count the number of rows which satisfy a provided condition</li> <li><code>sumIf()</code> - calculate a sum from rows which satisfy a provided condition</li> <li><code>avgIf()</code> - calculate an average from rows which satisfy a provided condition</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/date-time-functions/" target="_blank" rel="noopener"><strong>New date and time functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>toYear()</code></li> <li><code>toMonth()</code></li> <li><code>toDayOfMonth()</code></li> <li><code>toDayOfWeek()</code></li> <li><code>toHour()</code></li> <li><code>toMinute()</code></li> <li><code>toSecond()</code></li> <li><code>toStartOfYear()</code></li> <li><code>toStartOfMonth()</code></li> <li><code>toStartOfWeek()</code></li> <li><code>toStartOfDay()</code></li> <li><code>toStartOfHour()</code></li> <li><code>toStartOfFifteenMinutes()</code></li> <li><code>toStartOfTenMinutes()</code></li> <li><code>toStartOfFiveMinutes()</code></li> <li><code>toStartOfMinute()</code></li> <li><code>today()</code></li> <li><code>toYYYYMM()</code></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ready-to-get-started">Ready to get started?</h4><a class="anchor-link" href="#ready-to-get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Whether you're building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. <a href="https://developers.cloudflare.com/analytics/analytics-engine/get-started/">Get started </a> with Workers Analytics Engine and explore all available functions in our <a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/">SQL reference documentation</a>.</p>Wed, 12 Nov 2025 00:00:00 GMTWorkers Analytics EngineWorkers Analytics EngineWorkersCloudflare One Client - WARP client for Windows (version 2025.9.558.0)https://developers.cloudflare.com/changelog/post/2025-11-11-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2025-11-11-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features including <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">Path Maximum Transmission Unit Discovery (PMTUD)</a>. When PMTUD is enabled, the client will dynamically adjust packet sizing to optimize connection performance. There is also a new connection status message in the GUI to inform users that the local network connection may be unstable. This will make it easier to diagnose connectivity issues.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an inconsistency with <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices">Global WARP override</a> settings in multi-user environments when switching between users.</li> <li>The GUI now displays the health of the tunnel and DNS connections by showing a connection status message when the network may be unstable. This will make it easier to diagnose connectivity issues.</li> <li>Fixed an issue where deleting a registration was erroneously reported as having failed.</li> <li>Path Maximum Transmission Unit Discovery (PMTUD) may now be used to discover the effective MTU of the connection. This allows the WARP client to improve connectivity optimized for each network. PMTUD is disabled by default. To enable it, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">PMTUD documentation</a>.</li> <li>Improvements for the <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/os-version/">OS version</a> WARP client check. Windows Updated Build Revision (UBR) numbers can now be checked by the client to ensure devices have required security patches and features installed.</li> <li>The WARP client now supports Windows 11 ARM-based machines. For information on known limitations, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/known-limitations/#cloudflare-one-client-disconnected-on-windows-arm">Known limitations page</a>.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 11 Nov 2025 17:28:35 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.9.558.0)https://developers.cloudflare.com/changelog/post/2025-11-11-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2025-11-11-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features including <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">Path Maximum Transmission Unit Discovery (PMTUD)</a>. When PMTUD is enabled, the client will dynamically adjust packet sizing to optimize connection performance. There is also a new connection status message in the GUI to inform users that the local network connection may be unstable. This will make it easier to diagnose connectivity issues.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The GUI now displays the health of the tunnel and DNS connections by showing a connection status message when the network may be unstable. This will make it easier to diagnose connectivity issues.</li> <li>Fixed an issue where deleting a registration was erroneously reported as having failed.</li> <li>Path Maximum Transmission Unit Discovery (PMTUD) may now be used to discover the effective MTU of the connection. This allows the WARP client to improve connectivity optimized for each network. PMTUD is disabled by default. To enable it, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">PMTUD documentation</a>.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Tue, 11 Nov 2025 17:28:35 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Linux (version 2025.9.558.0)https://developers.cloudflare.com/changelog/post/2025-11-11-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2025-11-11-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features including <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">Path Maximum Transmission Unit Discovery (PMTUD)</a>. When PMTUD is enabled, the client will dynamically adjust packet sizing to optimize connection performance. There is also a new connection status message in the GUI to inform users that the local network connection may be unstable. This will make it easier to diagnose connectivity issues.</p> <p>WARP client version 2025.8.779.0 introduced an updated public key for Linux packages. The public key must be updated if it was installed before September 12, 2025 to ensure the repository remains functional after December 4, 2025. Instructions to make this update are available at <a href="https://pkg.cloudflareclient.com/">pkg.cloudflareclient.com</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The GUI now displays the health of the tunnel and DNS connections by showing a connection status message when the network may be unstable. This will make it easier to diagnose connectivity issues.</li> <li>Fixed an issue where deleting a registration was erroneously reported as having failed.</li> <li>Path Maximum Transmission Unit Discovery (PMTUD) may now be used to discover the effective MTU of the connection. This allows the WARP client to improve connectivity optimized for each network. PMTUD is disabled by default. To enable it, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery">PMTUD documentation</a>.</li> </ul> Tue, 11 Nov 2025 15:06:09 GMTCloudflare One ClientCloudflare One ClientLog Explorer - Resize your custom SQL window in Log Explorerhttps://developers.cloudflare.com/changelog/post/2025-11-11-resize-sql-window/https://developers.cloudflare.com/changelog/post/2025-11-11-resize-sql-window/<p>We're excited to announce a quality-of-life improvement for Log Explorer users. You can now resize the custom SQL query window to accommodate longer and more complex queries.</p> <p>Previously, if you were writing a long custom SQL query, the fixed-size window required excessive scrolling to view the full query. This update allows you to easily drag the bottom edge of the query window to make it taller. This means you can view your entire custom query at once, improving the efficiency and experience of writing and debugging complex queries.</p> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/log-explorer/">Log Explorer documentation</a>.</p>Tue, 11 Nov 2025 00:00:00 GMTLog ExplorerLog ExplorerLogs - Logpush Health Dashboardshttps://developers.cloudflare.com/changelog/post/2025-11-11-health-dashboards/https://developers.cloudflare.com/changelog/post/2025-11-11-health-dashboards/<p>We’re excited to introduce <strong>Logpush Health Dashboards</strong>, giving customers real-time visibility into the status, reliability, and performance of their <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a> jobs. Health dashboards make it easier to detect delivery issues, monitor job stability, and track performance across destinations. The dashboards are divided into two sections:</p> <ul> <li> <p><strong>Upload Health</strong>: See how much data was successfully uploaded, where drops occurred, and how your jobs are performing overall. This includes data completeness, success rate, and upload volume.</p> </li> <li> <p><strong>Upload Reliability</strong> – Diagnose issues impacting stability, retries, or latency, and monitor key metrics such as retry counts, upload duration, and destination availability.</p> </li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1333,height=334,format=webp/_astro/Health-Dashboard.CP0mV0IW.gif" alt="Health Dashboard" loading="lazy" decoding="async" width="1333" height="334"> <p>Health Dashboards can be accessed from the Logpush page in the Cloudflare dashboard at the account or zone level, under the Health tab. For more details, refer to our <a href="https://developers.cloudflare.com/logs/logpush/logpush-health"><strong>Logpush Health Dashboards</strong></a> documentation, which includes a comprehensive troubleshooting guide to help interpret and resolve common issues.</p>Tue, 11 Nov 2025 00:00:00 GMTLogsLogsCloudflare Tunnel, Cloudflare Tunnel for SASE - cloudflared proxy-dns command will be removed starting February 2, 2026https://developers.cloudflare.com/changelog/post/2025-11-11-cloudflared-proxy-dns/https://developers.cloudflare.com/changelog/post/2025-11-11-cloudflared-proxy-dns/<p>Starting February 2, 2026, the <code>cloudflared proxy-dns</code> command will be removed from all new <code>cloudflared</code> <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/">releases</a>.</p> <p>This change is being made to enhance security and address a potential vulnerability in an underlying DNS library. This vulnerability is specific to the <code>proxy-dns</code> command and does not affect any other <code>cloudflared</code> features, such as the core <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> service.</p> <p>The <code>proxy-dns</code> command, which runs a client-side <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/">DNS-over-HTTPS (DoH)</a> proxy, has been an officially undocumented feature for several years. This functionality is fully and securely supported by our actively developed products.</p> <p>Versions of <code>cloudflared</code> released before this date will not be affected and will continue to operate. However, note that our <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/#deprecated-releases">official support policy</a> for any <code>cloudflared</code> release is one year from its release date.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="migration-paths">Migration paths</h4><a class="anchor-link" href="#migration-paths"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We strongly advise users of this undocumented feature to migrate to one of the following officially supported solutions before February 2, 2026, to continue benefiting from secure <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/">DNS-over-HTTPS</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="end-user-devices">End-user devices</h4><a class="anchor-link" href="#end-user-devices"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The preferred method for enabling DNS-over-HTTPS on user devices is the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/">Cloudflare WARP client</a>. The WARP client automatically secures and proxies all DNS traffic from your device, integrating it with your organization's <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Zero Trust policies</a> and <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/">posture checks</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="servers-routers-and-iot-devices">Servers, routers, and IoT devices</h4><a class="anchor-link" href="#servers-routers-and-iot-devices"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For scenarios where installing a client on every device is not possible (such as servers, routers, or IoT devices), we recommend using the <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">WARP Connector</a>.</p> <p>Instead of running <code>cloudflared proxy-dns</code> on a machine, you can install the WARP Connector on a single Linux host within your private network. This connector will act as a gateway, securely routing all DNS and network traffic from your <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/">entire subnet</a> to Cloudflare for <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">filtering and logging</a>.</p>Tue, 11 Nov 2025 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEAI Crawl Control - Crawler drilldowns with extended actions menuhttps://developers.cloudflare.com/changelog/post/2025-11-10-ai-crawl-control-crawler-info/https://developers.cloudflare.com/changelog/post/2025-11-10-ai-crawl-control-crawler-info/<p>AI Crawl Control now supports per-crawler drilldowns with an extended actions menu and status code analytics. Drill down into Metrics, Cloudflare Radar, and Security Analytics, or export crawler data for use in <a href="https://developers.cloudflare.com/waf/custom-rules/">WAF custom rules</a>, <a href="https://developers.cloudflare.com/rules/url-forwarding/">Redirect Rules</a>, and robots.txt files.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="status-code-distribution-chart">Status code distribution chart</h4><a class="anchor-link" href="#status-code-distribution-chart"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <strong>Metrics</strong> tab includes a status code distribution chart showing HTTP response codes (2xx, 3xx, 4xx, 5xx) over time. Filter by individual crawler, category, operator, or time range to analyze how specific crawlers interact with your site.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=1104,format=webp/_astro/ai-crawl-control-status-codes.DESJcAiK.png" alt="AI Crawl Control status code distribution chart" loading="lazy" decoding="async" width="1712" height="1104"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="extended-actions-menu">Extended actions menu</h4><a class="anchor-link" href="#extended-actions-menu"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Each crawler row includes a three-dot menu with per-crawler actions:</p> <ul> <li><strong>View Metrics</strong> — Filter the AI Crawl Control Metrics page to the selected crawler.</li> <li><strong>View on Cloudflare Radar</strong> — Access verified crawler details on Cloudflare Radar.</li> <li><strong>Copy User Agent</strong> — Copy user agent strings for use in WAF custom rules, Redirect Rules, or robots.txt files.</li> <li><strong>View in Security Analytics</strong> — Filter Security Analytics by detection IDs (Bot Management customers).</li> <li><strong>Copy Detection ID</strong> — Copy detection IDs for use in WAF custom rules (Bot Management customers).</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2040,height=762,format=webp/_astro/ai-crawl-control-crawler-info.Dwc39LqI.png" alt="AI Crawl Control crawler actions menu" loading="lazy" decoding="async" width="2040" height="762"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Log in to the Cloudflare dashboard, and select your account and domain.</li> <li>Go to <strong>AI Crawl Control</strong> &gt; <strong>Metrics</strong> to access the status code distribution chart.</li> <li>Go to <strong>AI Crawl Control</strong> &gt; <strong>Crawlers</strong> and select the three-dot menu for any crawler to access per-crawler actions.</li> <li>Select multiple crawlers to use bulk copy buttons for user agents or detection IDs.</li> </ol> <p>Learn more about <a href="https://developers.cloudflare.com/ai-crawl-control/">AI Crawl Control</a>.</p>Mon, 10 Nov 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlWAF - WAF Release - 2025-11-10https://developers.cloudflare.com/changelog/post/2025-11-10-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-10-waf-release/ <p>This week’s release introduces new detections for Prototype Pollution across three common vectors: URI, Body, and Header/Form.</p> <p><strong>Key Findings</strong></p> <ul> <li>These attacks can affect both API and web applications by altering normal behavior or bypassing security controls.</li> </ul> <p><strong>Impact</strong></p> <p>Exploitation may allow attackers to change internal logic or cause unexpected behavior in applications using JavaScript or Node.js frameworks. Developers should sanitize input keys and avoid merging untrusted data structures.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="32405a50728746dd8caa057b606285e6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...606285e6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Generic Rules - Prototype Pollution - URI</td><td>Log</td><td>Disabled</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a7da00c63c4243d2a72456fe4f59ff26"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4f59ff26</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Prototype Pollution - Body</td><td>Log</td><td>Disabled</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="833078bdcfa04bb7aa7b8fb67efbeb39"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7efbeb39</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Prototype Pollution - Header - Form</td><td>Log</td><td>Disabled</td><td>This is a new detection</td></tr></tbody></table>Mon, 10 Nov 2025 00:00:00 GMTWAFWAFWorkers - Select Wrangler environments using the CLOUDFLARE_ENV environment variablehttps://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/https://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/<p>Wrangler now supports using the <code>CLOUDFLARE_ENV</code> <a href="https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables">environment variable</a> to select the active <a href="https://developers.cloudflare.com/workers/wrangler/environments/">environment</a> for your Worker commands. This provides a more flexible way to manage environments, especially when working with build tools and CI/CD pipelines.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Environment selection via environment variable:</strong></p> <ul> <li>Set <code>CLOUDFLARE_ENV</code> to specify which environment to use for Wrangler commands</li> <li>Works with all Wrangler commands that support the <code>--env</code> flag</li> <li>The <code>--env</code> command line argument takes precedence over the <code>CLOUDFLARE_ENV</code> environment variable</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-usage">Example usage</h4><a class="anchor-link" href="#example-usage"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Deploy to the production environment using CLOUDFLARE_ENV</span></span> <span class="line"><span class="nb-shiki-140thh">CLOUDFLARE_ENV</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">production</span><span class="nb-shiki-1t8gfj"> wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Upload a version to the staging environment</span></span> <span class="line"><span class="nb-shiki-140thh">CLOUDFLARE_ENV</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">staging</span><span class="nb-shiki-1t8gfj"> wrangler</span><span class="nb-shiki-mdbnqw"> versions</span><span class="nb-shiki-mdbnqw"> upload</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># The --env flag takes precedence over CLOUDFLARE_ENV</span></span> <span class="line"><span class="nb-shiki-140thh">CLOUDFLARE_ENV</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">dev</span><span class="nb-shiki-1t8gfj"> wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-dzsirb"> --env</span><span class="nb-shiki-mdbnqw"> production</span></span> <span class="line"><span class="nb-shiki-21nrsd"># This will deploy to production, not dev</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="use-with-build-tools">Use with build tools</h4><a class="anchor-link" href="#use-with-build-tools"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>CLOUDFLARE_ENV</code> environment variable is particularly useful when working with build tools like Vite. You can set the environment once during the build process, and it will be used for both building and deploying your Worker:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Set the environment for both build and deploy</span></span> <span class="line"><span class="nb-shiki-140thh">CLOUDFLARE_ENV</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">production</span><span class="nb-shiki-1t8gfj"> npm</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> build</span><span class="nb-shiki-140thh"> &amp; </span><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <p>When using <code>@cloudflare/vite-plugin</code>, the build process generates a <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#generated-wrangler-configuration">"redirected deploy config"</a> that is flattened to only contain the active environment. Wrangler will validate that the environment specified matches the environment used during the build to prevent accidentally deploying a Worker built for one environment to a different environment.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/workers/wrangler/system-environment-variables/">System environment variables</a></li> <li><a href="https://developers.cloudflare.com/workers/wrangler/environments/">Environments</a></li> </ul>Sun, 09 Nov 2025 00:00:00 GMTWorkersWorkersCache - Inspect Cache Keys with Cloudflare Tracehttps://developers.cloudflare.com/changelog/post/2025-11-07-cache-keys-for-cloudflare-trace/https://developers.cloudflare.com/changelog/post/2025-11-07-cache-keys-for-cloudflare-trace/<p>You can now see the exact cache key generated for any request directly in Cloudflare Trace. This visibility helps you troubleshoot cache hits and misses, and verify that your Custom Cache Keys — configured via Cache Rules or Page Rules — are working as intended.</p> <p>Previously, diagnosing caching behavior required inferring the key from configuration settings. Now, you can confirm that your custom logic for headers, query strings, and device types is correctly applied.</p> <p>Access Trace via the <a href="https://developers.cloudflare.com/rules/trace-request/how-to/#use-trace-in-the-dashboard">dashboard</a> or <a href="https://developers.cloudflare.com/api/resources/request_tracer/methods/trace/">API</a>, either manually for ad-hoc debugging or automated as part of your quality-of-service monitoring.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-scenario">Example scenario</h4><a class="anchor-link" href="#example-scenario"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you have a Cache Rule that segments content based on a specific cookie (for example, <code>user_region</code>), run a Trace with that cookie present to confirm the <code>user_region</code> value appears in the resulting cache key.</p> <p>The Trace response includes the cache key in the <code>cache</code> object:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "step_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"request"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cache"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "matched"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "public_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Cache Parameters"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cache"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "key"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "zone_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"023e105f4ecef8ad9ca31a8372d0c353"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "scheme"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"https"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "host"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "uri"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"/images/hero.jpg"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "key_string"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"023e105f4ecef8ad9ca31a8372d0c353::::https://example.com/images/hero.jpg:::::"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To learn more, refer to the <a href="https://developers.cloudflare.com/rules/trace-request/">Trace documentation</a> and our guide on <a href="https://developers.cloudflare.com/cache/how-to/cache-keys/">Custom Cache Keys</a>.</p>Fri, 07 Nov 2025 00:00:00 GMTCacheCacheWorkers - Workers automatic tracing, now in open betahttps://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/https://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/ <p>Enable automatic tracing on your Workers, giving you detailed metadata and timing information for every operation your Worker performs.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1920,height=1080,format=webp/_astro/R2_Screenshot.DAnOidMq.png" alt="Tracing example" loading="lazy" decoding="async" width="1920" height="1080"> <p>Tracing helps you identify performance bottlenecks, resolve errors, and understand how your Worker interacts with other services on the Workers platform. You can now answer questions like:</p> <ul> <li>Which calls are slowing down my application?</li> <li>Which queries to my database take the longest?</li> <li>What happened within a request that resulted in an error?</li> </ul> <p><strong>You can now:</strong></p> <ul> <li>View traces alongside your logs in the Workers Observability dashboard</li> <li>Export traces (and correlated logs) to any <a href="https://opentelemetry.io/docs/specs/otel/protocol/" target="_blank" rel="noopener">OTLP-compatible destination<span class="external-link"> ↗</span></a>, such as <a href="https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/honeycomb/">Honeycomb</a>, <a href="https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/sentry/">Sentry</a> or <a href="https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/grafana-cloud/">Grafana</a>, by configuring a tracing destination in the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/destinations" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a></li> <li>Analyze and query across span attributes (operation type, status, duration, errors)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="to-get-started-set">To get started, set:</h4><a class="anchor-link" href="#to-get-started-set"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "observability"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "traces"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>In the future, Cloudflare plans to enable automatic tracing in addition to logs when you set <code>observability.enabled = true</code> in your Wrangler configuration.</p><p>While automatic tracing is in early beta, this setting will not enable tracing by default, and will only enable logs.</p><p>An updated <a href="https://developers.cloudflare.com/workers/configuration/compatibility-dates/"><code>compatibility_date</code></a> will be required for this change to take effect.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="want-to-learn-more">Want to learn more?</h4><a class="anchor-link" href="#want-to-learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://blog.cloudflare.com/workers-tracing-now-in-open-beta/" target="_blank" rel="noopener">Read the announcement<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/workers/observability/traces/">Check out the documentation</a></li> </ul>Fri, 07 Nov 2025 00:00:00 GMTWorkersWorkersCloudflare One, Cloudflare WAN - Automatic Return Routing (Beta)https://developers.cloudflare.com/changelog/post/2025-11-06-automatic-return-routing-beta/https://developers.cloudflare.com/changelog/post/2025-11-06-automatic-return-routing-beta/<p>Magic WAN now supports Automatic Return Routing (ARR), allowing customers to configure Magic on-ramps (IPsec/GRE/CNI) to learn the return path for traffic flows without requiring static routes.</p> <p>Key benefits:</p> <ul> <li><strong>Route-less mode</strong>: Static or dynamic routes are optional when using ARR.</li> <li><strong>Overlapping IP space support</strong>: Traffic originating from customer sites can use overlapping private IP ranges.</li> <li><strong>Symmetric routing</strong>: Return traffic is guaranteed to use the same connection as the original on-ramp.</li> </ul> <p>This feature is currently in beta and requires the new Unified Routing mode (beta).</p> <p>For configuration details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-routes/#configure-automatic-return-routing-beta">Configure Automatic Return Routing</a>.</p>Thu, 06 Nov 2025 00:00:00 GMTCloudflare OneCloudflare OneCloudflare WANCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Designate WAN link for breakout traffichttps://developers.cloudflare.com/changelog/post/2025-11-06-connector-designate-wan-link-breakout/https://developers.cloudflare.com/changelog/post/2025-11-06-connector-designate-wan-link-breakout/<p>Magic WAN Connector now allows you to designate a specific WAN port for breakout traffic, giving you deterministic control over the egress path for latency-sensitive applications.</p> <p>With this feature, you can:</p> <ul> <li>Pin breakout traffic for specific applications to a preferred WAN port.</li> <li>Ensure critical traffic (such as Zoom or Teams) always uses your fastest or most reliable connection.</li> <li>Benefit from automatic failover to standard WAN port priority if the preferred port goes down.</li> </ul> <p>This is useful for organizations with multiple ISP uplinks who need predictable egress behavior for performance-sensitive traffic.</p> <p>For configuration details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/application-based-policies/breakout-traffic/#designate-wan-ports-for-breakout-apps">Designate WAN ports for breakout apps</a>.</p>Thu, 06 Nov 2025 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANGateway - Applications to be remapped to the new categorieshttps://developers.cloudflare.com/changelog/post/2025-11-06-Applications-recategorised-plan/https://developers.cloudflare.com/changelog/post/2025-11-06-Applications-recategorised-plan/<p>We have previously added new application categories to better reflect their content and improve HTTP traffic management: refer to <a href="https://developers.cloudflare.com/cloudflare-one/changelog/gateway/#2025-10-28">Changelog</a>. While the new categories are live now, we want to ensure you have ample time to review and adjust any existing rules you have configured against old categories. The remapping of existing applications into these new categories will be completed by January 30, 2026. This timeline allows you a dedicated period to:</p> <ul> <li>Review the new category structure.</li> <li>Identify any policies you have that target the older categories.</li> <li>Adjust your rules to reference the new, more precise categories before the old mappings change. Once the applications have been fully remapped by January 30, 2026, you might observe some changes in the traffic being mitigated or allowed by your existing policies. We encourage you to use the intervening time to prepare for a smooth transition.</li> </ul> <p><strong>Applications being remappedd</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Application Name</th> <th>Existing Category</th> <th>New Category</th> </tr> </thead> <tbody> <tr> <td>Google Photos</td> <td>File Sharing</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>Flickr</td> <td>File Sharing</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>ADP</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>Greenhouse</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>myCigna</td> <td>Human Resources</td> <td>Health &amp; Fitness</td> </tr> <tr> <td>UnitedHealthcare</td> <td>Human Resources</td> <td>Health &amp; Fitness</td> </tr> <tr> <td>ZipRecruiter</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>Amazon Business</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>Jobcenter</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>Jobsuche</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>Zenjob</td> <td>Human Resources</td> <td>Business</td> </tr> <tr> <td>DocuSign</td> <td>Legal</td> <td>Business</td> </tr> <tr> <td>Postident</td> <td>Legal</td> <td>Business</td> </tr> <tr> <td>Adobe Creative Cloud</td> <td>Productivity</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>Airtable</td> <td>Productivity</td> <td>Development</td> </tr> <tr> <td>Autodesk Fusion360</td> <td>Productivity</td> <td>IT Management</td> </tr> <tr> <td>Coursera</td> <td>Productivity</td> <td>Education</td> </tr> <tr> <td>Microsoft Power BI</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Tableau</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Duolingo</td> <td>Productivity</td> <td>Education</td> </tr> <tr> <td>Adobe Reader</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>AnpiReport</td> <td>Productivity</td> <td>Travel</td> </tr> <tr> <td>ビズリーチ</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>doda (デューダ)</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>求人ボックス</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>マイナビ2026</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Power Apps</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>RECRUIT AGENT</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>シフトボード</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>スタンバイ</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Doctolib</td> <td>Productivity</td> <td>Health &amp; Fitness</td> </tr> <tr> <td>Miro</td> <td>Productivity</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>MyFitnessPal</td> <td>Productivity</td> <td>Health &amp; Fitness</td> </tr> <tr> <td>Sentry Mobile</td> <td>Productivity</td> <td>Travel</td> </tr> <tr> <td>Slido</td> <td>Productivity</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>Arista Networks</td> <td>Productivity</td> <td>IT Management</td> </tr> <tr> <td>Atlassian</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>CoderPad</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>eAgreements</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Vmware</td> <td>Productivity</td> <td>IT Management</td> </tr> <tr> <td>Vmware Vcenter</td> <td>Productivity</td> <td>IT Management</td> </tr> <tr> <td>AWS Skill Builder</td> <td>Productivity</td> <td>Education</td> </tr> <tr> <td>Microsoft Office 365 (GCC)</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Microsoft Exchange Online (GCC)</td> <td>Productivity</td> <td>Business</td> </tr> <tr> <td>Canva</td> <td>Sales &amp; Marketing</td> <td>Photography &amp; Graphic Design</td> </tr> <tr> <td>Instacart</td> <td>Shopping</td> <td>Food &amp; Drink</td> </tr> <tr> <td>Wawa</td> <td>Shopping</td> <td>Food &amp; Drink</td> </tr> <tr> <td>McDonald's</td> <td>Shopping</td> <td>Food &amp; Drink</td> </tr> <tr> <td>Vrbo</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>American Airlines</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>Booking.com</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>Ticketmaster</td> <td>Shopping</td> <td>Entertainment &amp; Events</td> </tr> <tr> <td>Airbnb</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>DoorDash</td> <td>Shopping</td> <td>Food &amp; Drink</td> </tr> <tr> <td>Expedia</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>EasyPark</td> <td>Shopping</td> <td>Travel</td> </tr> <tr> <td>UEFA Tickets</td> <td>Shopping</td> <td>Entertainment &amp; Events</td> </tr> <tr> <td>DHL Express</td> <td>Shopping</td> <td>Business</td> </tr> <tr> <td>UPS</td> <td>Shopping</td> <td>Business</td> </tr> </tbody> </table></div> <p>For more information on creating HTTP policies, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/application-app-types/">Applications and app types</a>.</p>Thu, 06 Nov 2025 00:00:00 GMTGatewayGatewayD1, Workers - D1 can restrict data localization with jurisdictionshttps://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/https://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/<p>You can now set a <a href="https://developers.cloudflare.com/d1/configuration/data-location/">jurisdiction</a> when creating a D1 database to guarantee where your database runs and stores data. Jurisdictions can help you comply with data localization regulations such as GDPR. Supported jurisdictions include <code>eu</code> and <code>fedramp</code>.</p> <p>A jurisdiction can only be set at database creation time via wrangler, REST API or the UI and cannot be added/updated after the database already exists.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler@latest</span><span class="nb-shiki-mdbnqw"> d1</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> db-with-jurisdiction</span><span class="nb-shiki-dzsirb"> --jurisdiction</span><span class="nb-shiki-mdbnqw"> eu</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/d1/database"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{"name": "db-with-jurisdiction", "jurisdiction": "eu" }'</span></span></code></pre></figure> <p>To learn more, visit D1's data location <a href="https://developers.cloudflare.com/d1/configuration/data-location/">documentation</a>.</p>Wed, 05 Nov 2025 00:00:00 GMTD1D1WorkersLogs - Logpush Permission Update for Zero Trust Datasetshttps://developers.cloudflare.com/changelog/post/2025-11-05-logpush-permissions-update/https://developers.cloudflare.com/changelog/post/2025-11-05-logpush-permissions-update/<p><a href="https://developers.cloudflare.com/logs/logpush/permissions/">Permissions</a> for managing Logpush jobs related to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/">Zero Trust datasets</a> (Access, Gateway, and DEX) have been updated to improve data security and enforce appropriate access controls.</p> <p>To view, create, update, or delete Logpush jobs for Zero Trust datasets, users must now have both of the following permissions:</p> <ul> <li>Logs Edit</li> <li>Zero Trust: PII Read</li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Update your UI, API or Terraform configurations to include the new permissions. Requests to Zero Trust datasets will fail due to insufficient access without the additional permission.</p></div></div></aside>Wed, 05 Nov 2025 00:00:00 GMTLogsLogsWAF - WAF Release - 2025-11-05 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-11-05-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-05-emergency-waf-release/ <p>This week’s emergency release introduces a new detection signature that enhances coverage for a critical vulnerability in the React Native Metro Development Server, tracked as CVE-2025-11953.</p> <p><strong>Key Findings</strong></p> <p>The Metro Development Server exposes an HTTP endpoint that is vulnerable to OS command injection (CWE-78). An unauthenticated network attacker can send a crafted request to this endpoint and execute arbitrary commands on the host running Metro. The vulnerability affects Metro/cli-server-api builds used by React Native Community CLI in pre-patch development releases.</p> <p><strong>Impact</strong></p> <p>Successful exploitation of CVE-2025-11953 may result in remote command execution on developer workstations or CI/build agents, leading to credential and secret exposure, source tampering, and potential lateral movement into internal networks. Administrators and developers are strongly advised to apply the vendor's patches and restrict Metro’s network exposure to reduce this risk.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="db6b9e1ac1494971ae8c70aac8e30c5b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c8e30c5b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>React Native Metro - Command Injection - CVE:CVE-2025-11953</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Wed, 05 Nov 2025 00:00:00 GMTWAFWAFWorkers VPC - Announcing Workers VPC Services (Beta)https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/<p><strong>Workers VPC Services</strong> is now available, enabling your Workers to securely access resources in your private networks, without having to expose them on the public Internet.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>VPC Services</strong>: Create secure connections to internal APIs, databases, and services using familiar Worker binding syntax</li> <li><strong>Multi-cloud Support</strong>: Connect to resources in private networks in any external cloud (AWS, Azure, GCP, etc.) or on-premise using Cloudflare Tunnels</li> </ul> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Perform application logic in Workers here</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Sample call to an internal API running on ECS in AWS using the binding</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AWS_VPC_ECS_API</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://internal-host.example.com"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Additional application logic in Workers</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="getting-started">Getting started</h4><a class="anchor-link" href="#getting-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Set up a Cloudflare Tunnel, create a VPC Service, add service bindings to your Worker, and access private resources securely. <a href="https://developers.cloudflare.com/workers-vpc/">Refer to the documentation</a> to get started.</p>Wed, 05 Nov 2025 00:00:00 GMTWorkers VPCWorkers VPCLog Explorer - Log Explorer now supports query cancellationhttps://developers.cloudflare.com/changelog/post/2025-11-04-query-cancellation/https://developers.cloudflare.com/changelog/post/2025-11-04-query-cancellation/<p>We're excited to announce that Log Explorer users can now cancel queries that are currently running.</p> <p>This new feature addresses a common pain point: waiting for a long, unintended, or misconfigured query to complete before you can submit a new, correct one. With query cancellation, you can immediately stop the execution of any undesirable query, allowing you to quickly craft and submit a new query, significantly improving your investigative workflow and productivity within Log Explorer.</p>Tue, 04 Nov 2025 00:00:00 GMTLog ExplorerLog ExplorerLog Explorer - Log Explorer now shows query result distributionhttps://developers.cloudflare.com/changelog/post/2025-11-13-query-result-distribution/https://developers.cloudflare.com/changelog/post/2025-11-13-query-result-distribution/<p>We're excited to announce a new feature in Log Explorer that significantly enhances how you analyze query results: the Query results distribution chart.</p> <p>This new chart provides a graphical distribution of your results over the time window of the query. Immediately after running a query, you will see the distribution chart above your result table. This visualization allows Log Explorer users to quickly spot trends, identify anomalies, and understand the temporal concentration of log events that match their criteria. For example, you can visually confirm if a spike in traffic or errors occurred at a specific time, allowing you to focus your investigation efforts more effectively. This feature makes it faster and easier to extract meaningful insights from your vast log data.</p> <p>The chart will dynamically update to reflect the logs matching your current query.</p>Tue, 04 Nov 2025 00:00:00 GMTLog ExplorerLog ExplorerWAF - WAF Release - 2025-11-03https://developers.cloudflare.com/changelog/post/2025-11-03-waf-release/https://developers.cloudflare.com/changelog/post/2025-11-03-waf-release/ <p>This week highlights enhancements to detection signatures improving coverage for vulnerabilities in Adobe Commerce and Magento Open Source, linked to CVE-2025-54236.</p> <p><strong>Key Findings</strong></p> <p>This vulnerability allows unauthenticated attackers to take over customer accounts through the Commerce REST API and, in certain configurations, may lead to remote code execution. The latest update provides enhanced detection logic for resilient protection against exploitation attempts.</p> <p><strong>Impact</strong></p> <ul> <li>Adobe Commerce (CVE-2025-54236): Exploitation may allow attackers to hijack sessions, execute arbitrary commands, steal data, and disrupt storefronts, resulting in confidentiality and integrity risks for merchants. Administrators are strongly encouraged to apply vendor patches without delay.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f5295d8333b7428c816654d8cb6d5fe5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cb6d5fe5</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100774C</td><td>Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236</td><td>Log</td><td>Block</td><td>This is an improved detection.</td></tr></tbody></table>Mon, 03 Nov 2025 00:00:00 GMTWAFWAFWorkers - Capture Wrangler command output in structured formathttps://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/https://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/<p>You can now capture Wrangler command output in a structured <a href="https://github.com/ndjson/ndjson-spec" target="_blank" rel="noopener">ND-JSON<span class="external-link"> ↗</span></a> format by setting the <a href="https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables"><code>WRANGLER_OUTPUT_FILE_PATH</code></a> or <a href="https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables"><code>WRANGLER_OUTPUT_FILE_DIRECTORY</code></a> environment variables. This feature is particularly useful for CI/CD pipelines and automation tools that need programmatic access to deployment information such as worker names, version IDs, deployment URLs, and error details. Commands that support this feature include <a href="https://developers.cloudflare.com/workers/wrangler/commands/#deploy"><code>wrangler deploy</code></a>, <a href="https://developers.cloudflare.com/workers/wrangler/commands/#versions"><code>wrangler versions upload</code></a>, <a href="https://developers.cloudflare.com/workers/wrangler/commands/#versions"><code>wrangler versions deploy</code></a>, and <a href="https://developers.cloudflare.com/workers/wrangler/commands/#deploy-1"><code>wrangler pages deploy</code></a>.</p>Mon, 03 Nov 2025 00:00:00 GMTWorkersWorkersSecurity Center - Report logo misuse to Cloudflare directly from the Brand Protection dashboardhttps://developers.cloudflare.com/changelog/post/2025-10-31-brand-protection-logo-dashboard-report-abuse/https://developers.cloudflare.com/changelog/post/2025-10-31-brand-protection-logo-dashboard-report-abuse/<p>The Brand Protection logo query dashboard now allows you to use the <strong>Report to Cloudflare</strong> button to submit an Abuse report directly from the Brand Protection logo queries dashboard. While you could previously report new domains that were impersonating your brand before, now you can do the same for websites found to be using your logo without your permission. The abuse reports will be prefilled and you will only need to validate a few fields before you can click the submit button, after which our team process your request.</p> <p>Ready to start? Check out the <a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection docs</a>.</p>Fri, 31 Oct 2025 00:00:00 GMTSecurity CenterSecurity CenterWorkers, Durable Objects, Browser Run - Workers WebSocket message size limit increased from 1 MiB to 32 MiBhttps://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/https://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/<p>Workers, including those using <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a> and <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a>, may now process WebSocket messages up to 32 MiB in size. Previously, this limit was 1 MiB.</p> <p>This change allows Workers to handle use cases requiring large message sizes, such as processing Chrome Devtools Protocol messages.</p> <p>For more information, please see the <a href="https://developers.cloudflare.com/durable-objects/platform/limits/#sqlite-backed-durable-objects-general-limits">Durable Objects startup limits</a>.</p>Fri, 31 Oct 2025 00:00:00 GMTWorkersWorkersDurable ObjectsBrowser RunWorkflows, Workers - Increased Workflows instance and concurrency limitshttps://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/https://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/<p>We've raised the <a href="https://developers.cloudflare.com/workflows/">Cloudflare Workflows</a> account-level limits for all accounts on the <a href="https://developers.cloudflare.com/workers/platform/pricing/">Workers paid plan</a>:</p> <ul> <li><strong>Instance creation rate</strong> increased from 100 workflow instances per 10 seconds to 100 instances per second</li> <li><strong>Concurrency limit</strong> increased from 4,500 to 10,000 workflow instances per account</li> </ul> <p>These increases mean you can create new instances up to 10x faster, and have more workflow instances concurrently executing. To learn more and get started with Workflows, refer to <a href="https://developers.cloudflare.com/workflows/get-started/guide/">the getting started guide</a>.</p> <p>If your application requires a higher limit, fill out the <a href="https://developers.cloudflare.com/workers/platform/limits/">Limit Increase Request Form</a> or contact your account team. Please refer to <a href="https://developers.cloudflare.com/workflows/reference/pricing/">Workflows pricing</a> for more information.</p>Fri, 31 Oct 2025 00:00:00 GMTWorkflowsWorkflowsWorkersCloudflare Fundamentals - Introducing email two-factor authenticationhttps://developers.cloudflare.com/changelog/post/2025-10-30-email-2FA/https://developers.cloudflare.com/changelog/post/2025-10-30-email-2FA/<p>Two-factor authentication (2FA) is one of the best ways to protect your account from the risk of account takeover. Cloudflare has offered phishing resistant 2FA options including hardware based keys (for example, a Yubikey) and app based TOTP (time-based one-time password) options which use apps like Google or Microsoft's Authenticator app. Unfortunately, while these solutions are very secure, they can be lost if you misplace the hardware based key, or lose the phone which includes that app. The result is that users sometimes get locked out of their accounts and need to contact support.</p> <p>Today, we are announcing the addition of email as a 2FA factor for all Cloudflare accounts. Email 2FA is in wide use across the industry as a least common denominator for 2FA because it is low friction, loss resistant, and still improves security over username/password login only. We also know that most commercial email providers already require 2FA, so your email address is usually well protected already.</p> <p>You can now enable email 2FA on the Cloudflare dashboard:</p> <ol> <li>Go to <strong>Profile</strong> at the top right corner.</li> <li>Select <strong>Authentication</strong>.</li> <li>Under <strong>Two-Factor Authentication</strong>, select <strong>Set up</strong>.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sign-in-security-best-practices">Sign-in security best practices</h4><a class="anchor-link" href="#sign-in-security-best-practices"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare is critical infrastructure, and you should protect it as such. Review the following best practices and make sure you are doing your part to secure your account:</p> <ul> <li>Use a unique password for every website, including Cloudflare, and store it in a password manager like 1Password or Keeper. These services are cross-platform and simplify the process of managing secure passwords.</li> <li>Use 2FA to make it harder for an attacker to get into your account in the event your password is leaked.</li> <li>Store your backup codes securely. A password manager is the best place since it keeps the backup codes encrypted, but you can also print them and put them somewhere safe in your home.</li> <li>If you use an app to manage your 2FA keys, enable cloud backup, so that you don't lose your keys in the event you lose your phone.</li> <li>If you use a custom email domain to sign in, <a href="https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/">configure SSO</a>.</li> <li>If you use a public email domain like Gmail or Hotmail, you can also use social login with Apple, GitHub, or Google to sign in.</li> <li>If you manage a Cloudflare account for work: <ul> <li>Have at least two administrators in case one of them unexpectedly leaves your company.</li> <li>Use SCIM to automate permissions management for members in your Cloudflare account.</li> </ul> </li> </ul>Thu, 30 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare Fundamentals - Revamped Member Management UIhttps://developers.cloudflare.com/changelog/post/2025-10-30-member-management-improvements/https://developers.cloudflare.com/changelog/post/2025-10-30-member-management-improvements/<p>As Cloudflare's platform has grown, so has the need for precise, role-based access control. We’ve redesigned the Member Management experience in the Dashboard to help administrators more easily discover, assign, and refine permissions for specific principals.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's New</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Refreshed member invite flow</strong></p> <p>We overhauled the Invite Members UI to simplify inviting users and assigning permissions.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-invite-experience.B7F3VQ_y.gif" alt="Updated Invite Flow UX" loading="lazy" decoding="async" width="800" height="435"> <p><strong>Refreshed Members Overview Page</strong></p> <p>We've updated the Members Overview Page to clearly display:</p> <ul> <li>Member 2FA status</li> <li>Which members hold Super Admin privileges</li> <li>API access settings per member</li> <li>Member onboarding state (accepted vs pending invite)</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3016,height=1424,format=webp/_astro/2025-10-30-member-management-screen.BLc2lx98.png" alt="Updated Member Management Overview" loading="lazy" decoding="async" width="3016" height="1424"> <p><strong>New Member Permission Policies Details View</strong></p> <p>We've created a new member details screen that shows all permission policies associated with a member; including policies inherited from group associations to make it easier for members to understand the effective permissions they have.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-permission-policies-screen.pMj53si2.gif" alt="Updated Permission Policies Details Screen" loading="lazy" decoding="async" width="800" height="435"> <p><strong>Improved Member Permission Workflow</strong></p> <p>We redesigned the permission management experience to make it faster and easier for administrators to review roles and grant access.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-permission-policies-screen.pMj53si2.gif" alt="Updated Member Permission Management UX" loading="lazy" decoding="async" width="800" height="435"> <p><strong>Account-scoped Policies Restrictions Relaxed</strong></p> <p>Previously, customers could only associate a single account-scoped policy with a member. We've relaxed this restriction, and now Administrators can now assign multiple account-scoped policies to the same member; bringing policy assignment behavior in-line with user-groups and providing greater flexibility in managing member permissions.</p>Thu, 30 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsRules - New TCP-based fields available in Rulesetshttps://developers.cloudflare.com/changelog/post/2025-10-30-tcp-rtt-and-tcp-fields/https://developers.cloudflare.com/changelog/post/2025-10-30-tcp-rtt-and-tcp-fields/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="build-rules-based-on-tcp-transport-and-latency">Build rules based on TCP transport and latency</h4><a class="anchor-link" href="#build-rules-based-on-tcp-transport-and-latency"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare now provides two new request fields in the Ruleset engine that let you make decisions based on whether a request used TCP and the measured TCP round-trip time between the client and Cloudflare. These fields help you understand protocol usage across your traffic and build policies that respond to network performance. For example, you can distinguish TCP from QUIC traffic or route high latency requests to alternative origins when needed.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-fields">New fields</h4><a class="anchor-link" href="#new-fields"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>cf.edge.client_tcp</code></td> <td>Boolean</td> <td>Indicates whether the request used TCP. A value of true means the client connected using TCP instead of QUIC.</td> </tr> <tr> <td><code>cf.timings.client_tcp_rtt_msec</code></td> <td>Number</td> <td>Reports the smoothed TCP round-trip time between the client and Cloudflare in milliseconds. For example, a value of 20 indicates roughly twenty milliseconds of RTT.</td> </tr> </tbody> </table></div> <p>Example filter expression:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">cf.edge.client_tcp &amp;&amp; cf.timings.client_tcp_rtt_msec &lt; 100</span></span></code></pre></figure> <p>More information can be found in the Rules language <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/">fields reference</a>.</p>Thu, 30 Oct 2025 00:00:00 GMTRulesRulesWAF - WAF Release - 2025-10-30 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-10-30-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-30-emergency-waf-release/ <p>This week’s release introduces a new detection signature that enhances coverage for a critical vulnerability in Oracle E-Business Suite, tracked as CVE-2025-61884.</p> <p><strong>Key Findings</strong></p> <p>The flaw is easily exploitable and allows an unauthenticated attacker with network access to compromise Oracle Configurator, which can grant access to sensitive resources and configuration data. The affected versions include 12.2.3 through 12.2.14.</p> <p><strong>Impact</strong></p> <p>Successful exploitation of CVE-2025-61884 may result in unauthorized access to critical business data or full exposure of information accessible through Oracle Configurator. Administrators are strongly advised to apply vendor's patches and recommended mitigations to reduce this exposure.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2749f13f8cb34a3dbd49c8c48827402f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8827402f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Oracle E-Business Suite - SSRF - CVE:CVE-2025-61884</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Thu, 30 Oct 2025 00:00:00 GMTWAFWAFWorkers - Access Workers preview URLs from the Build details pagehttps://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/https://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/<p>You can now access <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">preview URLs</a> directly from the build details page, making it easier to test your changes when reviewing builds in the dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1656,height=1112,format=webp/_astro/builds-preview-button.CjGnhkt7.png" alt="preview button" loading="lazy" decoding="async" width="1656" height="1112"> <p><strong>What's new</strong></p> <ul> <li>A <strong>Preview</strong> button now appears in the top-right corner of the build details page for successful builds</li> <li>Click it to instantly open the latest preview URL</li> <li>Matches the same experience you're familiar with from Pages</li> </ul>Thu, 30 Oct 2025 00:00:00 GMTWorkersWorkersAccess - Access private hostname applications support all ports/protocolshttps://developers.cloudflare.com/changelog/post/2025-10-28-Access-Application-Support-For-All-Ports-And-Protocols/https://developers.cloudflare.com/changelog/post/2025-10-28-Access-Application-Support-For-All-Ports-And-Protocols/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/">Cloudflare Access for private hostname applications</a> can now secure traffic on all ports and protocols.</p> <p>Previously, applying Zero Trust policies to private applications required the application to use HTTPS on port <code>443</code> and support Server Name Indicator (SNI).</p> <p>This update removes that limitation. As long as the application is reachable via a Cloudflare off-ramp, you can now enforce your critical security controls — like single sign-on (SSO), MFA, device posture, and variable session lengths — to any private application. This allows you to extend Zero Trust security to services like SSH, RDP, internal databases, and other non-HTTPS applications.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1283,height=496,format=webp/_astro/internal_private_app_any_port.DNXnEy0u.png" alt="Example private application on non-443 port" loading="lazy" decoding="async" width="1283" height="496"> <p>For example, you can now create a self-hosted application in Access for <code>ssh.testapp.local</code> running on port <code>22</code>. You can then build a policy that only allows engineers in your organization to connect after they pass an SSO/MFA check and are using a corporate device.</p> <p>This feature is generally available across all plans.</p>Tue, 28 Oct 2025 00:00:00 GMTAccessAccessAI Search - Reranking and API-based system prompt configuration in AI Searchhttps://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/https://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/<p><a href="https://developers.cloudflare.com/ai-search/">AI Search</a> now supports reranking for improved retrieval quality and allows you to set the system prompt directly in your API requests.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rerank-for-more-relevant-results">Rerank for more relevant results</h4><a class="anchor-link" href="#rerank-for-more-relevant-results"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now enable <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/reranking/">reranking</a> to reorder retrieved documents based on their semantic relevance to the user’s query. Reranking helps improve accuracy, especially for large or noisy datasets where vector similarity alone may not produce the optimal ordering.</p> <p>You can enable and configure reranking in the dashboard or directly in your API requests:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> answer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">autorag</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-autorag"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">aiSearch</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> query: </span><span class="nb-shiki-mdbnqw">"How do I train a llama to deliver coffee?"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-3.3-70b-instruct-fp8-fast"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> reranking: {</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"@cf/baai/bge-reranker-base"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="set-system-prompts-in-api">Set system prompts in API</h4><a class="anchor-link" href="#set-system-prompts-in-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously, <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/system-prompt/">system prompts</a> could only be configured in the dashboard. You can now define them directly in your API requests, giving you per-query control over behavior. For example:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-21nrsd">// Dynamically set query and system prompt in AI Search</span></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> getAnswer</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">query</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">tone</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> systemPrompt</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> `You are a ${</span><span class="nb-shiki-140thh">tone</span><span class="nb-shiki-mdbnqw">} assistant.`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">autorag</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-autorag"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">aiSearch</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> query: query,</span></span> <span class="line"><span class="nb-shiki-140thh"> system_prompt: systemPrompt,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Example usage</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> query</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "What is Cloudflare?"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tone</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "friendly"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> answer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> getAnswer</span><span class="nb-shiki-140thh">(query, tone);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(answer);</span></span></code></pre></figure> <p>Learn more about <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/reranking/">Reranking</a> and <a href="https://developers.cloudflare.com/ai-search/configuration/retrieval/system-prompt/">System Prompt</a> in AI Search.</p>Tue, 28 Oct 2025 00:00:00 GMTAI SearchAI SearchCASB - CASB introduces new granular roleshttps://developers.cloudflare.com/changelog/post/2025-10-28-casb-roles/https://developers.cloudflare.com/changelog/post/2025-10-28-casb-roles/<p>Cloudflare CASB (Cloud Access Security Broker) now supports two new granular roles to provide more precise access control for your security teams:</p> <ul> <li><strong>Cloudflare CASB Read:</strong> Provides read-only access to view CASB findings and dashboards. This role is ideal for security analysts, compliance auditors, or team members who need visibility without modification rights.</li> <li><strong>Cloudflare CASB:</strong> Provides full administrative access to configure and manage all aspects of the CASB product.</li> </ul> <p>These new roles help you better enforce the principle of least privilege. You can now grant specific members access to CASB security findings without assigning them broader permissions, such as the <strong>Super Administrator</strong> or <strong>Administrator</strong> roles.</p> <p>To enable <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/">Data Loss Prevention (DLP)</a>, scans in CASB, account members will need the <strong>Cloudflare Zero Trust</strong> role.</p> <p>You can find these new roles when inviting members or creating API tokens in the Cloudflare dashboard under <strong>Manage Account</strong> &gt; <strong>Members</strong>.</p> <p>To learn more about managing roles and permissions, refer to the <a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/">Manage account members and roles documentation</a>.</p>Tue, 28 Oct 2025 00:00:00 GMTCASBCASBGateway - New Application Categories added for HTTP Traffic Managementhttps://developers.cloudflare.com/changelog/post/Gateway-application-categories-added/https://developers.cloudflare.com/changelog/post/Gateway-application-categories-added/<p>To give you precision and flexibility while creating policies to block unwanted traffic, we are introducing new, more granular application categories in the Gateway product.</p> <p>We have added the following categories to provide more precise organization and allow for finer-grained policy creation, designed around how users interact with different types of applications:</p> <ul> <li>Business</li> <li>Education</li> <li>Entertainment &amp; Events</li> <li>Food &amp; Drink</li> <li>Health &amp; Fitness</li> <li>Lifestyle</li> <li>Navigation</li> <li>Photography &amp; Graphic Design</li> <li>Travel</li> </ul> <p>The new categories are live now, but we are providing a transition period for existing applications to be fully remapped to these new categories.</p> <p>The full remapping will be completed by January 30, 2026.</p> <p>We encourage you to use this time to:</p> <ul> <li>Review the new category structure.</li> <li>Identify and adjust any existing HTTP policies that reference older categories to ensure a smooth transition.</li> </ul> <p>For more information on creating HTTP policies, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/application-app-types/">Applications and app types</a>.</p>Tue, 28 Oct 2025 00:00:00 GMTGatewayGatewayLogs - Azure Sentinel Connectorhttps://developers.cloudflare.com/changelog/post/2025-10-27-Sentinel-connector/https://developers.cloudflare.com/changelog/post/2025-10-27-Sentinel-connector/<p>Logpush now supports integration with <a href="https://www.microsoft.com/en-us/security/business/siem-and-xdr/microsoft-sentinel" target="_blank" rel="noopener">Microsoft Sentinel<span class="external-link"> ↗</span></a>.The new Azure Sentinel Connector built on Microsoft’s Codeless Connector Framework (CCF), is now available. This solution replaces the previous Azure Functions-based connector, offering significant improvements in security, data control, and ease of use for customers. Logpush customers can send logs to Azure Blob Storage and configure this new Sentinel Connector to ingest those logs directly into Microsoft Sentinel.</p> <p>This upgrade significantly streamlines log ingestion, improves security, and provides greater control:</p> <ul> <li>Simplified Implementation: Easier for engineering teams to set up and maintain.</li> <li>Cost Control: New support for Data Collection Rules (DCRs) allows you to filter and transform logs at ingestion time, offering potential cost savings.</li> <li>Enhanced Security: CCF provides a higher level of security compared to the older Azure Functions connector.</li> <li>Data Lake Integration: Includes native integration with Data Lake.</li> </ul> <p>Find the new solution <a href="https://marketplace.microsoft.com/en-us/product/azure-application/cloudflare.azure-sentinel-solution-cloudflare-ccf?tab=Overview" target="_blank" rel="noopener">here<span class="external-link"> ↗</span></a> and refer to the <a href="https://developers.cloudflare.com/analytics/analytics-integrations/sentinel/#supported-logs:~:text=WorkBook%20fields,-Analytic%20rules" target="_blank" rel="noopener">Cloudflare's developer documentation<span class="external-link"> ↗</span></a>for more information on the connector, including setup steps, supported logs and Microsoft's resources.</p>Mon, 27 Oct 2025 00:00:00 GMTLogsLogsRadar - TLD Insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-10-27-radar-tld-insights/https://developers.cloudflare.com/changelog/post/2025-10-27-radar-tld-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now introduces Top-Level Domain (TLD) insights, providing visibility into popularity based on the DNS magnitude metric, detailed TLD information including its type, manager, DNSSEC support, RDAP support, and WHOIS data, and trends such as DNS query volume and geographic distribution observed by the <a href="https://developers.cloudflare.com/1.1.1.1/">1.1.1.1</a> DNS resolver.</p> <p>The following dimensions were added to the Radar DNS API, specifically, to the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/methods/summary_v2/"><code>/dns/summary/{dimension}</code></a> and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/methods/timeseries_groups_v2/"><code>/dns/timeseries_groups/{dimension}</code></a> endpoints:</p> <ul> <li><code>tld</code>: Top-level domain extracted from DNS queries; can also be used as a filter.</li> <li><code>tld_dns_magnitude</code>: Top-level domain ranking by <a href="https://developers.cloudflare.com/radar/glossary#dns-magnitude">DNS magnitude</a>.</li> </ul> <p>And the following endpoints were added:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/tlds/methods/list/"><code>/tlds</code></a> - Lists all TLDs.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/tlds/methods/get/"><code>/tlds/{tld}</code></a> - Retrieves information about a specific TLD.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=2344,format=webp/_astro/tld-ranking-by-dns-magnitude.DbmrooPK.png" alt="Screenshot of the TLD ranking by DNS magnitude" loading="lazy" decoding="async" width="1600" height="2344"> <p>Learn more about the new Radar DNS insights in our <a href="https://blog.cloudflare.com/introducing-tld-insights-on-cloudflare-radar/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>, and check out the <a href="https://radar.cloudflare.com/tlds" target="_blank" rel="noopener">new Radar page<span class="external-link"> ↗</span></a>.</p>Mon, 27 Oct 2025 00:00:00 GMTRadarRadarSecurity Center - Cloudforce One RFI tokens are now visible in the dashboardhttps://developers.cloudflare.com/changelog/post/2025-10-27-RFI-Tokens-in-Dash/https://developers.cloudflare.com/changelog/post/2025-10-27-RFI-Tokens-in-Dash/<p>The Requests for Information (RFI) dashboard now shows users the number of tokens used by each submitted RFI to better understand usage of tokens and how they relate to each request submitted.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2380,height=1216,format=webp/_astro/2025-10-24RFITokens.DPm1e8uC.png" alt="Cloudforce One RFI tokens" loading="lazy" decoding="async" width="2380" height="1216"> <p>What’s new:</p> <ul> <li>Users can now see the number of tokens used for a submitted request for information.</li> <li>Users can see the remaining tokens allocated to their account for the quarter.</li> <li>Users can only select the Routine priority for the <code>Strategic Threat Research</code> request type.</li> </ul> <p>Cloudforce One subscribers can try it now in <a href="https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/requests" target="_blank" rel="noopener">Application Security &gt; Threat Intelligence &gt; Requests for Information<span class="external-link"> ↗</span></a>.</p>Mon, 27 Oct 2025 00:00:00 GMTSecurity CenterSecurity CenterWAF - WAF Release - 2025-10-24 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-10-24-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-24-emergency-waf-release/ <p>This week’s release introduces a new detection signature that enhances coverage for a critical vulnerability in Windows Server Update Services (WSUS), tracked as CVE-2025-59287.</p> <p><strong>Key Findings</strong></p> <p>The vulnerability allows unauthenticated attackers to potentially achieve remote code execution. The updated detection logic strengthens defenses by improving resilience against exploitation attempts targeting this flaw.</p> <p><strong>Impact</strong></p> <p>Successful exploitation of CVE-2025-59287 could enable attackers to hijack sessions, execute arbitrary commands, exfiltrate sensitive data, and disrupt storefront operations. These actions pose significant confidentiality and integrity risks to affected environments. Administrators should apply vendor patches immediately to mitigate exposure.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5eaeb5ea6e5a4bce867eb3ffbd72ba08"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bd72ba08</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Windows Server - Deserialization - CVE:CVE-2025-59287</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Fri, 24 Oct 2025 00:00:00 GMTWAFWAFWorkers - Automatic resource provisioning for KV, R2, and D1https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/ <p>Previously, if you wanted to develop or deploy a worker with attached resources, you'd have to first manually create the desired resources. Now, if your Wrangler configuration file includes a KV namespace, D1 database, or R2 bucket that does not yet exist on your account, you can develop locally and deploy your application seamlessly, without having to run additional commands.</p> <p>Automatic provisioning is launching as an open beta, and we'd love to hear your feedback to help us make improvements! It currently works for KV, R2, and D1 bindings. You can disable the feature using the <code>--no-x-provision</code> flag.</p> <p>To use this feature, update to wrangler@4.45.0 and add bindings to your config file <em>without</em> resource IDs e.g.:</p> <figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "kv_namespaces"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_KV"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "d1_databases"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_DB"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "r2_buckets"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_R2"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p><code>wrangler dev</code> will then automatically create these resources for you locally, and on your next run of <code>wrangler deploy</code>, Wrangler will call the Cloudflare API to create the requested resources and link them to your Worker.</p> <p>Though resource IDs will be automatically written back to your Wrangler config file after resource creation, resources will stay linked across future deploys even without adding the resource IDs to the config file. This is especially useful for shared templates, which now no longer need to include account-specific resource IDs when adding a binding.</p>Fri, 24 Oct 2025 00:00:00 GMTWorkersWorkersWorkers - Build TanStack Start apps with the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/https://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/ <p>The <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a> now supports <a href="https://tanstack.com/start/" target="_blank" rel="noopener">TanStack Start<span class="external-link"> ↗</span></a> apps. Get started with new or existing projects.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-projects">New projects</h4><a class="anchor-link" href="#new-projects"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Create a new TanStack Start project that uses the Cloudflare Vite plugin via the <code>create-cloudflare</code> CLI:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-npm" id="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-yarn" id="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-pnpm" id="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button></div><div role="tabpanel" id="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-npm" aria-labelledby="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-start</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-start" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-yarn" aria-labelledby="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> create cloudflare my-tanstack-start-app --framework=tanstack-start</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn create cloudflare my-tanstack-start-app --framework=tanstack-start" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-6ca51866-0ebe-423c-803b-9539237e904f-pnpm" aria-labelledby="pm-tab-pm-6ca51866-0ebe-423c-803b-9539237e904f-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> create cloudflare@latest my-tanstack-start-app --framework=tanstack-start</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm create cloudflare@latest my-tanstack-start-app --framework=tanstack-start" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="existing-projects">Existing projects</h4><a class="anchor-link" href="#existing-projects"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Migrate an existing TanStack Start project to use the Cloudflare Vite plugin:</p> <ol> <li>Install <code>@cloudflare/vite-plugin</code> and <code>wrangler</code></li> </ol> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-npm" id="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-yarn" id="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-pnpm" id="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-bun" id="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-npm" aria-labelledby="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i -D @cloudflare/vite-plugin wrangler</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i -D @cloudflare/vite-plugin wrangler" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-yarn" aria-labelledby="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add -D @cloudflare/vite-plugin wrangler</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add -D @cloudflare/vite-plugin wrangler" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-pnpm" aria-labelledby="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add -D @cloudflare/vite-plugin wrangler</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add -D @cloudflare/vite-plugin wrangler" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-bun" aria-labelledby="pm-tab-pm-170fe1cb-a170-4d84-a1b1-dbbf277c65a4-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add -d @cloudflare/vite-plugin wrangler</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add -d @cloudflare/vite-plugin wrangler" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div> <ol start="2"> <li>Add the Cloudflare plugin to your Vite config</li> </ol> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tanstackStart } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@tanstack/react-start/plugin/vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> viteReact </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@vitejs/plugin-react"</span><span class="nb-shiki-140thh">;</span></span> <span class="line highlighted"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span></span> <span class="line highlighted"><span class="nb-shiki-1t8gfj"> cloudflare</span><span class="nb-shiki-140thh">({ viteEnvironment: { name: </span><span class="nb-shiki-mdbnqw">"ssr"</span><span class="nb-shiki-140thh"> } }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> tanstackStart</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> viteReact</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <ol start="3"> <li>Add your Worker config file</li> </ol> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "$schema"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-tanstack-start-app"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_flags"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "nodejs_compat"</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "main"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"@tanstack/react-start/server-entry"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">"$schema" = </span><span class="nb-shiki-mdbnqw">"./node_modules/wrangler/config-schema.json"</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-tanstack-start-app"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_flags = [ </span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">main = </span><span class="nb-shiki-mdbnqw">"@tanstack/react-start/server-entry"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <ol start="4"> <li>Modify the scripts in your <code>package.json</code></li> </ol> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">package.json</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "scripts"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "dev"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"vite dev"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "build"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"vite build &amp;&amp; tsc --noEmit"</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff remove"><span class="nb-shiki-dzsirb"> "start"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"node .output/server/index.mjs"</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff add"><span class="nb-shiki-dzsirb"> "preview"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"vite preview"</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff add"><span class="nb-shiki-dzsirb"> "deploy"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"npm run build &amp;&amp; wrangler deploy"</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff add"><span class="nb-shiki-dzsirb"> "cf-typegen"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"wrangler types"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>See the <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/">TanStack Start framework guide</a> for more info.</p>Fri, 24 Oct 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-10-23 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-10-23-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-23-emergency-waf-release/ <p>This week highlights enhancements to detection signatures improving coverage for vulnerabilities in Adobe Commerce and Magento Open Source, linked to CVE-2025-54236.</p> <p><strong>Key Findings</strong></p> <p>This vulnerability allows unauthenticated attackers to take over customer accounts through the Commerce REST API and, in certain configurations, may lead to remote code execution. The latest update enhances detection logic to provide more resilient protection against exploitation attempts.</p> <p><strong>Impact</strong></p> <p>Adobe Commerce (CVE-2025-54236): Exploitation may allow attackers to hijack sessions, execute arbitrary commands, steal data, and disrupt storefronts, resulting in confidentiality and integrity risks for merchants. Administrators are strongly encouraged to apply vendor patches without delay.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6e04fa2b9eb34fb088034d3fc6ef59a1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c6ef59a1</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Thu, 23 Oct 2025 00:00:00 GMTWAFWAFWorkers AI - Workers AI Markdown Conversion: New endpoint to list supported formatshttps://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/https://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/<p>Developers can now programmatically retrieve a list of all file formats supported by the <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown Conversion utility</a> in Workers AI.</p> <p>You can use the <a href="https://developers.cloudflare.com/workers-ai/configuration/bindings/"><code>env.AI</code></a> binding:</p> <figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">supported</span><span class="nb-shiki-140thh">()</span></span></code></pre></figure> <p>Or call the REST API:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown/supported</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {API_TOKEN}'</span></span></code></pre></figure> <p>Both return a list of file formats that users can convert into Markdown:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">[</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "extension"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">".pdf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mimeType"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"application/pdf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "extension"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">".jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mimeType"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"image/jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-2bbn9v"> ...</span></span> <span class="line"><span class="nb-shiki-140thh">]</span></span></code></pre></figure> <p>Learn more about our <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown Conversion utility</a>.</p>Thu, 23 Oct 2025 00:00:00 GMTWorkers AIWorkers AIWorkers - Workers Preview URL default behavior now matches your workers.dev settinghttps://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/https://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/<p>We have updated the default behavior for Cloudflare Workers <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">Preview URLs</a>. <strong>Going forward, if a preview URL setting is not <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#toggle-preview-urls-enable-or-disable">explicitly configured</a> during deployment, its default behavior will automatically match the setting of your <a href="https://developers.cloudflare.com/workers/configuration/routing/workers-dev/"><code>workers.dev</code> subdomain</a>.</strong></p> <p>This change is intended to provide a more intuitive and secure experience by aligning your preview URL's default state with your <code>workers.dev</code> configuration to prevent cases where a preview URL might remain public even after you disabled your <code>workers.dev</code> route.</p> <p><strong>What this means for you:</strong></p> <ul> <li><strong>If neither setting is configured:</strong> both the workers.dev route and the preview URL will default to enabled</li> <li><strong>If your workers.dev route is enabled and you do not explicitly set Preview URLs to enabled or disabled:</strong> Preview URLs will default to enabled</li> <li><strong>If your workers.dev route is disabled and you do not explicitly set Preview URLs to enabled or disabled:</strong> Preview URLs will default to disabled</li> </ul> <p>You can override the default setting by explicitly enabling or disabling the preview URL in your Worker's configuration through the <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/subdomain/">API</a>, <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#from-the-dashboard">Dashboard</a>, or <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#from-the-wrangler-configuration-file">Wrangler</a>.</p> <p><strong>Wrangler Version Behavior</strong></p> <p>The default behavior depends on the version of Wrangler you are using. This new logic applies to the latest version. Here is a summary of the behavior across different versions:</p> <ul> <li><strong>Before v4.34.0:</strong> Preview URLs defaulted to enabled, regardless of the workers.dev setting.</li> <li><strong>v4.34.0 up to (but not including) v4.44.0:</strong> Preview URLs defaulted to disabled, regardless of the workers.dev setting.</li> <li><strong>v4.44.0 or later:</strong> Preview URLs now default to matching your workers.dev setting.</li> </ul> <p><strong>Why we’re making this change</strong></p> <p>In July, <a href="https://developers.cloudflare.com/changelog/2025-07-23-workers-preview-urls/">we introduced preview URLs to Workers</a>, which let you preview code changes before deploying to production. This made disabling your Worker’s workers.dev URL an ambiguous action — the preview URL, served as a subdomain of <code>workers.dev</code> (ex: <code>preview-id-worker-name.account-name.workers.dev</code>) would still be live even if you had disabled your Worker’s <code>workers.dev</code> route. If you misinterpreted what it meant to disable your <code>workers.dev</code> route, you might unintentionally leave preview URLs enabled when you didn’t mean to, and expose them to the public Internet.</p> <p>To address this, we made a <a href="https://developers.cloudflare.com/changelog/2025-09-17-update-preview-url-setting/">one-time update</a> to disable preview URLs on existing Workers that had their workers.dev route disabled and changed the default behavior to be disabled for all new deployments where a preview URL setting was not explicitly configured.</p> <p>While this change helped secure many customers, it was disruptive for customers who keep their <code>workers.dev</code> route enabled and actively use the preview functionality, as it now required them to explicitly enable preview URLs on every redeployment.This new, more intuitive behavior ensures that your preview URL settings align with your <code>workers.dev</code> configuration by default, providing a more secure and predictable experience.</p> <p><strong>Securing access to <code>workers.dev</code> and preview URL endpoints</strong></p> <p>To further secure your <code>workers.dev</code> subdomain and preview URL, you can <a href="https://developers.cloudflare.com/changelog/2025-10-03-one-click-access-for-workers/">enable Cloudflare Access with a single click</a> in your Worker's settings to limit access to specific users or groups.</p>Thu, 23 Oct 2025 00:00:00 GMTWorkersWorkersAI Crawl Control - New Robots.txt tab for tracking crawler compliancehttps://developers.cloudflare.com/changelog/post/2025-10-21-track-robots-txt/https://developers.cloudflare.com/changelog/post/2025-10-21-track-robots-txt/<p>AI Crawl Control now includes a <strong>Robots.txt</strong> tab that provides insights into how AI crawlers interact with your <code>robots.txt</code> files.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Robots.txt tab allows you to:</p> <ul> <li>Monitor the health status of <code>robots.txt</code> files across all your hostnames, including HTTP status codes, and identify hostnames that need a <code>robots.txt</code> file.</li> <li>Track the total number of requests to each <code>robots.txt</code> file, with breakdowns of successful versus unsuccessful requests.</li> <li>Check whether your <code>robots.txt</code> files contain <a href="https://contentsignals.org/" target="_blank" rel="noopener">Content Signals<span class="external-link"> ↗</span></a> directives for AI training, search, and AI input.</li> <li>Identify crawlers that request paths explicitly disallowed by your <code>robots.txt</code> directives, including the crawler name, operator, violated path, specific directive, and violation count.</li> <li>Filter <code>robots.txt</code> request data by crawler, operator, category, and custom time ranges.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="take-action">Take action</h4><a class="anchor-link" href="#take-action"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you identify non-compliant crawlers, you can:</p> <ul> <li>Block the crawler in the <a href="https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/">Crawlers tab</a></li> <li>Create custom <a href="https://developers.cloudflare.com/waf/">WAF rules</a> for path-specific security</li> <li>Use <a href="https://developers.cloudflare.com/rules/url-forwarding/">Redirect Rules</a> to guide crawlers to appropriate areas of your site</li> </ul> <p>To get started, go to <strong>AI Crawl Control</strong> &gt; <strong>Robots.txt</strong> in the Cloudflare dashboard. Learn more in the <a href="https://developers.cloudflare.com/ai-crawl-control/features/track-robots-txt/">Track robots.txt documentation</a>.</p>Tue, 21 Oct 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlGateway - Schedule DNS policies from the UIhttps://developers.cloudflare.com/changelog/post/2025-10-20-schedule-dns-policies-from-the-ui/https://developers.cloudflare.com/changelog/post/2025-10-20-schedule-dns-policies-from-the-ui/<p>Admins can now create <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/timed-policies/">scheduled DNS policies</a> directly from the Zero Trust dashboard, without using the API. You can configure policies to be active during specific, recurring times, such as blocking social media during business hours or gaming sites on school nights.</p> <ul> <li><strong>Preset Schedules</strong>: Use built-in templates for common scenarios like Business Hours, School Days, Weekends, and more.</li> <li><strong>Custom Schedules</strong>: Define your own schedule with specific days and up to three non-overlapping time ranges per day.</li> <li><strong>Timezone Control</strong>: Choose to enforce a schedule in a specific timezone (for example, US Eastern) or based on the local time of each user.</li> <li><strong>Combined with Duration</strong>: Policies can have both a schedule and a duration. If both are set, the duration's expiration takes precedence.</li> </ul> <p>You can see the flow in the demo GIF:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1053,height=879,format=webp/_astro/gateway-dns-scheduled-policies-ui.Cf4l1OTE.gif" alt="Schedule DNS policies demo" loading="lazy" decoding="async" width="1053" height="879"> <p>This update makes time-based DNS policies accessible to all Gateway customers, removing the technical barrier of the API.</p>Mon, 20 Oct 2025 00:00:00 GMTGatewayGatewayWAF - WAF Release - 2025-10-20https://developers.cloudflare.com/changelog/post/2025-10-20-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-20-waf-release/ <p>This week’s update introduces an enhanced rule that expands detection coverage for a critical vulnerability in Oracle E-Business Suite. It also improves an existing rule to provide more reliable coverage in request processing.</p> <p><strong>Key Findings</strong></p> <p>New WAF rule deployed for Oracle E-Business Suite (CVE-2025-61882) to block unauthenticated attacker's network access via HTTP to compromise Oracle Concurrent Processing. If successfully exploited, this vulnerability may result in remote code execution.</p> <p><strong>Impact</strong></p> <ul> <li>Successful exploitation of CVE-2025-61882 allows unauthenticated attackers to execute arbitrary code remotely by chaining multiple weaknesses, enabling lateral movement into internal services, data exfiltration, and large-scale extortionware deployment within Oracle E-Business Suite environments.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="933fc13202cd4e8ba498c0f32b4101ab"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2b4101ab</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100598A</td><td>Remote Code Execution - Common Bash Bypass - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "Remote Code Execution - Common Bash Bypass" (ID: <rule-id id="f8238867ed3e4d3a9a7b731a50cec478"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...50cec478</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="185b5df42d1e44e0aeb8f8b8a1118614"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a1118614</span></button></rule-id></td><td>100916A</td><td>Oracle E-Business Suite - Remote Code Execution - CVE:CVE-2025-61882 - 2</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="646bccf7e9dc46918a4150d6c22b51d3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c22b51d3</span></button></rule-id></td><td>N/A</td><td>HTTP Truncated</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 20 Oct 2025 00:00:00 GMTWAFWAFEmail security - On-Demand Security Reporthttps://developers.cloudflare.com/changelog/post/2025-10-16-on-demand-security-report/https://developers.cloudflare.com/changelog/post/2025-10-16-on-demand-security-report/<p>You can now generate on-demand security reports directly from the Cloudflare dashboard. This new feature provides a comprehensive overview of your email security posture, making it easier than ever to demonstrate the value of Cloudflare’s Email security to executives and other decision makers.</p> <p>These reports offer several key benefits:</p> <ul> <li><strong>Executive Summary:</strong> Quickly view the performance of Email security with a high-level executive summary.</li> <li><strong>Actionable Insights:</strong> Dive deep into trend data, breakdowns of threat types, and analysis of top targets to identify and address vulnerabilities.</li> <li><strong>Configuration Transparency:</strong> Gain a clear view of your policy, submission, and domain configurations to ensure optimal setup.</li> <li><strong>Account Takeover Risks:</strong> Get a snapshot of your M365 risky users (requires a Microsoft Entra ID P2 license and <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/microsoft-365/" target="_blank" rel="noopener">M365 SaaS integration<span class="external-link"> ↗</span></a>).</li> </ul> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/monitoring/download-report/#download-a-security-report">Download a security report</a>. <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1009,height=571,format=webp/_astro/report.CbkPa8Jt.png" alt="Report" loading="lazy" decoding="async" width="1009" height="571"></p> <p>This feature is available across the following Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Fri, 17 Oct 2025 22:14:43 GMTEmail securityEmail securitySecurity Center - New Application Security reports (Closed Beta)https://developers.cloudflare.com/changelog/post/2025-10-17-app-sec-reports/https://developers.cloudflare.com/changelog/post/2025-10-17-app-sec-reports/ <p>Cloudflare's new <strong>Application Security report</strong>, currently in Closed Beta, is now available in the dashboard.</p> <a href="https://dash.cloudflare.com/?to=/:account/security-center/reports" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Security reports</strong>&nbsp;&#8599;</a> <p>The reports are generated monthly and provide cyber security insights trends for all of the Enterprise zones in your Cloudflare account.</p> <p>The reports also include an industry benchmark, comparing your cyber security landscape to peers in your industry.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2379,height=3367,format=webp/_astro/2025-10-17-application-security-report-mock-data.Cz0-WuoX.png" alt="Application Security report mock data" loading="lazy" decoding="async" width="2379" height="3367"> <p>Learn more about the reports by referring to the <a href="https://developers.cloudflare.com/analytics/account-and-zone-analytics/app-security-reports/">Security Reports documentation</a>.</p> <p>Use the feedback survey link at the top of the page to help us improve the reports.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1126,height=448,format=webp/_astro/2025-10-17-report-feedback-survey.DPmUlWh2.png" alt="Application Security report survey" loading="lazy" decoding="async" width="1126" height="448">Fri, 17 Oct 2025 00:00:00 GMTSecurity CenterSecurity CenterWAF - New detections released for WAF managed rulesetshttps://developers.cloudflare.com/changelog/post/2025-10-17-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-17-emergency-waf-release/ <p>This week we introduced several new detections across Cloudflare Managed Rulesets, expanding coverage for high-impact vulnerability classes such as SSRF, SQLi, SSTI, Reverse Shell attempts, and Prototype Pollution. These rules aim to improve protection against attacker-controlled payloads that exploit misconfigurations or unvalidated input in web applications.</p> <p><strong>Key Findings</strong></p> <p>New detections added for multiple exploit categories:</p> <p>SSRF (Server-Side Request Forgery) — new rules targeting both local and cloud metadata abuse patterns (Beta).</p> <p>SQL Injection (SQLi) — rules for common patterns, sleep/time-based injections, and string/wait function exploitation across headers and URIs.</p> <p>SSTI (Server-Side Template Injection) — arithmetic-based probe detections introduced across URI, header, and body fields.</p> <p>Reverse Shell and XXE payloads — enhanced heuristics for command execution and XML external entity misuse.</p> <p>Prototype Pollution — new Beta rule identifying common JSON payload structures used in object prototype poisoning.</p> <p>PHP Wrapper Injection and HTTP Parameter Pollution detections — to catch path traversal and multi-parameter manipulation attempts.</p> <p>Anomaly Header Checks — detecting CRLF injection attempts in header names.</p> <p><strong>Impact</strong></p> <p>These updates help detect multi-vector payloads that blend SSRF + RCE or SQLi + SSTI attacks, especially in cloud-hosted applications with exposed metadata endpoints or unsafe template rendering.</p> <p>Prototype Pollution and HTTP parameter pollution rules address emerging JavaScript supply-chain exploitation patterns increasingly seen in real-world incidents.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="72f0ff933fb0492eb71cda50589f2a1d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...589f2a1d</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>N/A</td><td>Anomaly:Header - name - CR, LF</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5d0377e4435f467488614170132fab7e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...132fab7e</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Reverse Shell - Body</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54e32f7f802c4a699182e8921a027008"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1a027008</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Reverse Shell - Header</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7cbda8dbafbc465d9b64a8f2958d0486"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...958d0486</span></button></rule-id></td><td>N/A</td><td>Generic Rules - Reverse Shell - URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b9f3420674cf481da32333dc8e0cf7ad"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8e0cf7ad</span></button></rule-id></td><td>N/A</td><td>Generic Rules - XXE - Body</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ad55483512f0440b81426acdbf8aab5e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bf8aab5e</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi - Common Patterns - Header URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="849c0618d1674f1c92ba6f9b2e466337"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2e466337</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi - Sleep Function - Header URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1b4db4c4bd0649c095c27c6cb686ab47"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b686ab47</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi - String Function - Header URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fa2055b84af94ba4b925f834b0633709"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b0633709</span></button></rule-id></td><td>N/A</td><td>Generic Rules - SQLi - WaitFor Function - Header URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="158177dec2504acdba1f2da201a076eb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...01a076eb</span></button></rule-id></td><td>N/A</td><td>SSRF - Local - Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="98bfd6bb46074d5b8d1c4b39743a63ec"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...743a63ec</span></button></rule-id></td><td>N/A</td><td>SSRF - Local - 2 - Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54e1733b10da4a599e06c6fbc2e84e2d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c2e84e2d</span></button></rule-id></td><td>N/A</td><td>SSRF - Cloud - Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ecd26d61a75e46f6a4449a06ab8af26f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ab8af26f</span></button></rule-id></td><td>N/A</td><td>SSRF - Cloud - 2 - Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c16f4e133c4541f293142d02e6e8dc5b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e6e8dc5b</span></button></rule-id></td><td>N/A</td><td>SSTI - Arithmetic Probe - URI</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f4fd9904e7624666b8c49cd62550d794"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2550d794</span></button></rule-id></td><td>N/A</td><td>SSTI - Arithmetic Probe - Header</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5c0875604f774c36a4f9b69c659d12a6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...659d12a6</span></button></rule-id></td><td>N/A</td><td>SSTI - Arithmetic Probe - Body</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fae6fa37ae9249d58628e54b1a3e521e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1a3e521e</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9c02e585db34440da620eb668f76bd74"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8f76bd74</span></button></rule-id></td><td>N/A</td><td>PHP Wrapper Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cb67fe56a84747b8b64277dc091e296d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...091e296d</span></button></rule-id></td><td>N/A</td><td>HTTP parameter pollution</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="443b54d984944cd69043805ee34214ef"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e34214ef</span></button></rule-id></td><td>N/A</td><td>Prototype Pollution - Common Payloads - Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Fri, 17 Oct 2025 00:00:00 GMTWAFWAFCloudflare One Client - WARP client for Windows (version 2025.9.173.1)https://developers.cloudflare.com/changelog/post/2025-10-16-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2025-10-16-warp-windows-beta/<p>A new Beta release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features including Path Maximum Transmission Unit Discovery (PMTUD). With PMTUD enabled, the client will dynamically adjust packet sizing to optimize connection performance. There is also a new connection status message in the GUI to inform users that the local network connection may be unstable. This will make it easier to debug connectivity issues.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improvements for <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/">Windows multi-user</a> to maintain the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices">Global WARP override</a> state when switching between users.</li> <li>The GUI now displays the health of the tunnel and DNS connections by showing a connection status message when the network may be unstable. This will make it easier to debug connectivity issues.</li> <li>Deleting registrations no longer returns an error when succeeding.</li> <li>Path Maximum Transmission Unit Discovery (PMTUD) is now used to discover the effective MTU of the connection. This allows the client to improve connection performance optimized for the current network.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Thu, 16 Oct 2025 15:29:54 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.9.173.1)https://developers.cloudflare.com/changelog/post/2025-10-16-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2025-10-16-warp-macos-beta/<p>A new Beta release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes, improvements, and new features including Path Maximum Transmission Unit Discovery (PMTUD). With PMTUD enabled, the client will dynamically adjust packet sizing to optimize connection performance. There is also a new connection status message in the GUI to inform users that the local network connection may be unstable. This will make it easier to debug connectivity issues.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>The GUI now displays the health of the tunnel and DNS connections by showing a connection status message when the network may be unstable. This will make it easier to debug connectivity issues.</li> <li>Deleting registrations no longer returns an error when succeeding.</li> <li>Path Maximum Transmission Unit Discovery (PMTUD) is now used to discover the effective MTU of the connection. This allows the client to improve connection performance optimized for the current network.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>macOS Sequoia: Due to changes Apple introduced in macOS 15.0.x, the WARP client may not behave as expected. Cloudflare recommends the use of macOS 15.4 or later.</li> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Thu, 16 Oct 2025 15:29:52 GMTCloudflare One ClientCloudflare One ClientDurable Objects, Workers - View and edit Durable Object data in UI with Data Studio (Beta)https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1699,height=407,format=webp/_astro/do-data-studio.BfCcgtkq.png" alt="Screenshot of Durable Objects Data Studio" loading="lazy" decoding="async" width="1699" height="407"> <p>You can now view and write to each Durable Object's storage using a UI editor on the Cloudflare dashboard. Only Durable Objects using <a href="https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class">SQLite storage</a> can use Data Studio.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers/durable-objects" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Durable Objects</strong>&nbsp;&#8599;</a> <p>Data Studio unlocks easier data access with Durable Objects for prototyping application data models to debugging production storage usage. Before, querying your Durable Objects data required deploying a Worker.</p> <p>To access a Durable Object, you can provide an object's unique name or ID generated by Cloudflare. Data Studio requires you to have at least the <code>Workers Platform Admin</code> role, and all queries are captured with audit logging for your security and compliance needs. Queries executed by Data Studio send requests to your remote, deployed objects and incur normal usage billing.</p> <p>To learn more, visit the Data Studio <a href="https://developers.cloudflare.com/durable-objects/observability/data-studio/">documentation</a>. If you have feedback or suggestions for the new Data Studio, please share your experience on <a href="https://discord.com/channels/595317990191398933/773219443911819284" target="_blank" rel="noopener">Discord<span class="external-link"> ↗</span></a></p>Thu, 16 Oct 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersCloudflare Fundamentals - Increased HTTP header size limit to 128 KBhttps://developers.cloudflare.com/changelog/post/2025-10-16-header-limit-increase/https://developers.cloudflare.com/changelog/post/2025-10-16-header-limit-increase/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cdn-now-supports-128-kb-request-and-response-headers-">CDN now supports 128 KB request and response headers 🚀</h4><a class="anchor-link" href="#cdn-now-supports-128-kb-request-and-response-headers-"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We're excited to announce a significant increase in the maximum header size supported by Cloudflare's Content Delivery Network (CDN). Cloudflare now supports up to <strong>128 KB</strong> for both <strong>request and response headers</strong>.</p> <p>Previously, customers were limited to a total of 32 KB for request or response headers, with a maximum of 16 KB per individual header. Larger headers could cause requests to fail with <code>HTTP 413</code> (Request Header Fields Too Large) errors.</p> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new?</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Support for large headers:</strong> You can now utilize much larger headers, whether as a single large header up to 128 KB or split over multiple headers.</li> <li><strong>Reduces <code>413</code> and <code>520</code> HTTP errors:</strong> This change drastically reduces the likelihood of customers encountering <code>HTTP 413</code> errors from large request headers or <code>HTTP 520</code> errors caused by oversized response headers, improving the overall reliability of your web applications.</li> <li><strong>Enhanced functionality:</strong> This is especially beneficial for applications that rely on: <ul> <li>A large number of cookies.</li> <li>Large Content-Security-Policy (CSP) response headers.</li> <li>Advanced use cases with Cloudflare Workers that generate large response headers.</li> </ul> </li> </ul> <p>This enhancement improves compatibility with Cloudflare's CDN, enabling more use cases that previously failed due to header size limits.</p> <hr> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/fundamentals/reference/connection-limits/#request-limits">Cloudflare Fundamentals documentation</a>.</p>Thu, 16 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsLoad Balancing - Monitor Groups for Advanced Health Checking With Load Balancinghttps://developers.cloudflare.com/changelog/post/2025-08-15-monitor-groups-for-load-balancing/https://developers.cloudflare.com/changelog/post/2025-08-15-monitor-groups-for-load-balancing/<p>Cloudflare Load Balancing now supports Monitor Groups, a powerful new way to combine multiple health monitors into a single, logical group. This allows you to create sophisticated health checks that more accurately reflect the true availability of your applications by assessing multiple services at once.</p> <p>With Monitor Groups, you can ensure that all critical components of an application are healthy before sending traffic to an origin pool, enabling smarter failover decisions and greater resilience. This feature is now available via the API for customers with an Enterprise Load Balancing subscription.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-can-do">What you can do:</h4><a class="anchor-link" href="#what-you-can-do"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Combine Multiple Monitors</strong>: Group different health monitors (for example, HTTP, TCP) that check various application components, like a primary API gateway and a specific <code>/login</code> service.</li> <li><strong>Isolate Monitors for Observation</strong>: Mark a monitor as "monitoring only" to receive alerts and data without it affecting a pool's health status or traffic steering. This is perfect for testing new checks or observing non-critical dependencies.</li> <li><strong>Improve Steering Intelligence</strong>: Latency for Dynamic Steering is automatically averaged across all active monitors in a group, providing a more holistic view of an origin's performance.</li> </ul> <p>This enhancement is ideal for complex, multi-service applications where the health of one component depends on another. By aggregating health signals, Monitor Groups provide a more accurate and comprehensive assessment of your application's true status.</p> <p>For detailed information and API configuration guides, please visit our <a href="https://developers.cloudflare.com/load-balancing/monitors/monitor-groups">developer documentation</a> for Monitor Groups.</p>Thu, 16 Oct 2025 00:00:00 GMTLoad BalancingLoad BalancingAI Crawl Control - Enhanced AI Crawl Control metrics with new drilldowns and filtershttps://developers.cloudflare.com/changelog/post/2025-10-14-enhanced-metrics-drilldowns/https://developers.cloudflare.com/changelog/post/2025-10-14-enhanced-metrics-drilldowns/<p>AI Crawl Control now provides enhanced metrics and CSV data exports to help you better understand AI crawler activity across your sites.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="track-crawler-requests-over-time">Track crawler requests over time</h4><a class="anchor-link" href="#track-crawler-requests-over-time"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Visualize crawler activity patterns over time, and group data by different dimensions:</p> <ul> <li><strong>By Crawler</strong> — Track activity from individual AI crawlers (GPTBot, ClaudeBot, Bytespider)</li> <li><strong>By Category</strong> — Analyze crawler purpose or type</li> <li><strong>By Operator</strong> — Discover which companies (OpenAI, Anthropic, ByteDance) are crawling your site</li> <li><strong>By Host</strong> — Break down activity across multiple subdomains</li> <li><strong>By Status Code</strong> — Monitor HTTP response codes to crawlers (200s, 300s, 400s, 500s)</li> </ul> <figure><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1293,height=666,format=webp/_astro/ai-crawl-control-requests-over-time.BtRyz0OT.png" alt="AI Crawl Control requests over time chart with grouping tabs" title="Interactive chart showing crawler requests over time with filterable dimensions" loading="lazy" decoding="async" width="1293" height="666"><figcaption>Interactive chart showing crawler requests over time with filterable dimensions</figcaption></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="analyze-referrer-data-paid-plans">Analyze referrer data (Paid plans)</h4><a class="anchor-link" href="#analyze-referrer-data-paid-plans"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Identify traffic sources with referrer analytics:</p> <ul> <li>View top referrers driving traffic to your site</li> <li>Understand discovery patterns and content popularity from AI operators</li> </ul> <figure><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1291,height=656,format=webp/_astro/ai-crawl-control-top-referrers.CEUAwpd8.png" alt="AI Crawl Control top referrers breakdown" title="Bar chart showing top referrers and their respective traffic volumes" loading="lazy" decoding="async" width="1291" height="656"><figcaption>Bar chart showing top referrers and their respective traffic volumes</figcaption></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="export-data">Export data</h4><a class="anchor-link" href="#export-data"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Download your filtered view as a CSV:</p> <ul> <li>Includes all applied filters and groupings</li> <li>Useful for custom reporting and deeper analysis</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Log in to the Cloudflare dashboard, and select your account and domain.</li> <li>Go to <strong>AI Crawl Control</strong> &gt; <strong>Metrics</strong>.</li> <li>Use the grouping tabs to explore different views of your data.</li> <li>Apply filters to focus on specific crawlers, time ranges, or response codes.</li> <li>Select <strong>Download CSV</strong> to export your filtered data for further analysis.</li> </ol> <p>Learn more about <a href="https://developers.cloudflare.com/ai-crawl-control">AI Crawl Control</a>.</p>Tue, 14 Oct 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlCloudflare Fundamentals - Single sign-on now manageable in the user experiencehttps://developers.cloudflare.com/changelog/post/2025-10-14-sso-self-service-ux/https://developers.cloudflare.com/changelog/post/2025-10-14-sso-self-service-ux/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1378,height=877,format=webp/_astro/2025-10-14-sso-configuration-ux.DLkIKSax.png" alt="Screenshot of new user experience for managing SSO" loading="lazy" decoding="async" width="1378" height="877"> <p>During Birthday Week, we announced that <a href="https://blog.cloudflare.com/enterprise-grade-features-for-all/" target="_blank" rel="noopener">single sign-on (SSO) is available for free<span class="external-link"> ↗</span></a> to everyone who signs in with a custom email domain and maintains a compatible <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/" target="_blank" rel="noopener">identity provider<span class="external-link"> ↗</span></a>. SSO minimizes user friction around login and provides the strongest security posture available. At the time, this could only be configured using the API.</p> <p>Today, we are launching a new user experience which allows users to manage their SSO configuration from within the Cloudflare dashboard. You can access this by going to <strong>Manage account</strong> &gt; <strong>Members</strong> &gt; <strong>Settings</strong>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/">Cloudflare dashboard SSO</a></li> </ul>Tue, 14 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2025-10-13https://developers.cloudflare.com/changelog/post/2025-10-13-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-13-waf-release/ <p>This week’s highlights include a new JinJava rule targeting a sandbox-bypass flaw that could allow malicious template input to escape execution controls. The rule improves detection for unsafe template rendering paths.</p> <p><strong>Key Findings</strong></p> <p>New WAF rule deployed for JinJava (CVE-2025-59340) to block a sandbox bypass in the template engine that permits attacker-controlled type construction and arbitrary class instantiation; in vulnerable environments this can escalate to remote code execution and full server compromise.</p> <p><strong>Impact</strong></p> <ul> <li>CVE-2025-59340 — Exploitation enables attacker-supplied type descriptors / Jackson <code>ObjectMapper</code> abuse, allowing arbitrary class loading, file/URL access (LFI/SSRF primitives) and, with suitable gadget chains, potential remote code execution and system compromise.</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b327d6442e2d4848b4aab3cbc04bab5f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c04bab5f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100892</td><td>JinJava - SSTI - CVE:CVE-2025-59340</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 13 Oct 2025 00:00:00 GMTWAFWAFGateway - New domain categories addedhttps://developers.cloudflare.com/changelog/post/2025-10-10-new-domain-categories/https://developers.cloudflare.com/changelog/post/2025-10-10-new-domain-categories/<p>We have added three new domain categories under the Technology parent category, to better reflect online content and improve DNS filtering.</p> <p><strong>New categories added</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Parent ID</th> <th>Parent Name</th> <th>Category ID</th> <th>Category Name</th> </tr> </thead> <tbody> <tr> <td>26</td> <td>Technology</td> <td>194</td> <td>Keep Awake Software</td> </tr> <tr> <td>26</td> <td>Technology</td> <td>192</td> <td>Remote Access</td> </tr> <tr> <td>26</td> <td>Technology</td> <td>193</td> <td>Shareware/Freeware</td> </tr> </tbody> </table></div> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/domain-categories/">Gateway domain categories</a> to learn more.</p>Fri, 10 Oct 2025 00:00:00 GMTGatewayGatewayWorkers - Worker startup time limit increased to 1 secondhttps://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/https://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/ <p>You can now upload a Worker that takes up 1 second to parse and execute its global scope. Previously, startup time was limited to 400 ms.</p> <p>This allows you to run Workers that import more complex packages and execute more code prior to requests being handled.</p> <p>For more information, see the documentation on <a href="https://developers.cloudflare.com/workers/platform/limits/#worker-startup-time">Workers startup limits</a>.</p>Fri, 10 Oct 2025 00:00:00 GMTWorkersWorkersRadar - Expanded CT log activity insights on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-10-09-radar-ct-log-activity-insights/https://developers.cloudflare.com/changelog/post/2025-10-09-radar-ct-log-activity-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> has expanded its Certificate Transparency (CT) log insights with new stats that provide greater visibility into log activity:</p> <ul> <li><strong>Log growth rate</strong>: The average throughput of the CT log over the past 7 days, measured in certificates per hour.</li> <li><strong>Included certificate count</strong>: The total number of certificates already included in this CT log.</li> <li><strong>Eligible-for-inclusion certificate count</strong>: The number of certificates eligible for inclusion in this log but not yet included. This metric is based on certificates signed by trusted root CAs within the log’s accepted date range.</li> <li><strong>Last update</strong>: The timestamp of the most recent update to the CT log.</li> </ul> <p>These new statistics have been added to the response of the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/logs/methods/get/">Get Certificate Log Details</a> API endpoint, and are displayed on the <a href="https://radar.cloudflare.com/certificate-transparency/log/nimbus2025#log-activity" target="_blank" rel="noopener">CT log information page<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1598,height=441,format=webp/_astro/ct-log-activity.GHD-K7Mk.png" alt="Screenshot of the CT log activity card on the CT log information page" loading="lazy" decoding="async" width="1598" height="441">Thu, 09 Oct 2025 00:00:00 GMTRadarRadarWorkers - You can now deploy full-stack apps on Workers using Terraformhttps://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/https://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/ <p>You can now upload Workers with <a href="https://developers.cloudflare.com/workers/static-assets/">static assets</a> (like HTML, CSS, JavaScript, images) with the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs" target="_blank" rel="noopener">Cloudflare Terraform provider v5.11.0<span class="external-link"> ↗</span></a>, making it even easier to deploy and manage full-stack apps with IaC.</p> <p><strong>Previously</strong>, you couldn't use Terraform to upload static assets without writing custom scripts to handle generating an <a href="https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-manifest">asset manifest</a>, calling the <a href="https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-static-assets">Cloudflare API to upload assets in chunks</a>, and handling change detection.</p> <p><strong>Now</strong>, you simply define the directory where your assets are built, and we handle the rest. Check out the <a href="https://developers.cloudflare.com/changelog/#examples">examples</a> for what this looks like in Terraform configuration.</p> <p>You can get started today with <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs" target="_blank" rel="noopener">the Cloudflare Terraform provider (v5.11.0)<span class="external-link"> ↗</span></a>, using either the existing <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script" target="_blank" rel="noopener"><code>cloudflare_workers_script</code> resource<span class="external-link"> ↗</span></a>, or the beta <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code> resource<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="with-cloudflare_workers_script">With <code>cloudflare_workers_script</code></h4><a class="anchor-link" href="#with-cloudflare_workers_script"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Here's how you can use the existing <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_script" target="_blank" rel="noopener"><code>cloudflare_workers_script</code><span class="external-link"> ↗</span></a> resource to upload your Worker code and assets in one shot.</p> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_script"</span><span class="nb-shiki-dzsirb"> "my_app"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-app"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> content_file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "./dist/worker/index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_sha256</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> filesha256</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"./dist/worker/index.js"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "index.js"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> # Just point to your assets directory - that's it!</span></span> <span class="line"><span class="nb-shiki-140thh"> assets</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> directory </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "./dist/static"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="with-cloudflare_worker-cloudflare_worker_version-and-cloudflare_workers_deployment">With <code>cloudflare_worker</code>, <code>cloudflare_worker_version</code>, and <code>cloudflare_workers_deployment</code></h4><a class="anchor-link" href="#with-cloudflare_worker-cloudflare_worker_version-and-cloudflare_workers_deployment"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>And here's an example using the beta <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code><span class="external-link"> ↗</span></a> resource, alongside the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker" target="_blank" rel="noopener"><code>cloudflare_worker</code><span class="external-link"> ↗</span></a> and <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment" target="_blank" rel="noopener"><code>cloudflare_workers_deployment</code><span class="external-link"> ↗</span></a> resources:</p> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># This tracks the existence of your Worker, so that you</span></span> <span class="line"><span class="nb-shiki-21nrsd"># can upload code and assets separately from tracking Worker state.</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_worker"</span><span class="nb-shiki-dzsirb"> "my_app"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-app"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_worker_version"</span><span class="nb-shiki-dzsirb"> "my_app_version"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> worker_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">my_app</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">id</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> # Just point to your assets directory - that's it!</span></span> <span class="line"><span class="nb-shiki-140thh"> assets</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> directory </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "./dist/static"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> modules</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> name </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_file </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "./dist/worker/index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_type </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "application/javascript+module"</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_deployment"</span><span class="nb-shiki-dzsirb"> "my_app_deployment"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">my_app</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">name</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> strategy</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "percentage"</span></span> <span class="line"><span class="nb-shiki-140thh"> versions</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> version_id </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> cloudflare_worker_version.my_app_version.id</span></span> <span class="line"><span class="nb-shiki-140thh"> percentage </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> 100</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-changed">What's changed</h4><a class="anchor-link" href="#whats-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Under the hood, the Cloudflare Terraform provider now handles the same logic that Wrangler uses for static asset uploads. This includes scanning your assets directory, computing hashes for each file, generating a manifest with file metadata, and calling the Cloudflare API to upload any missing files in chunks. We support large directories with parallel uploads and chunking, and when the asset manifest hash changes, we detect what's changed and trigger an upload for <em>only</em> those changed files.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="try-it-out">Try it out</h4><a class="anchor-link" href="#try-it-out"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Get started with <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs" target="_blank" rel="noopener">the Cloudflare Terraform provider (v5.11.0)<span class="external-link"> ↗</span></a></li> <li>You can use either the existing <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script" target="_blank" rel="noopener"><code>cloudflare_workers_script</code> resource<span class="external-link"> ↗</span></a> to upload your Worker code and assets in one resource.</li> <li>Or you can use the new beta <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code> resource<span class="external-link"> ↗</span></a> (along with the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker" target="_blank" rel="noopener"><code>cloudflare_worker</code><span class="external-link"> ↗</span></a> and <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment" target="_blank" rel="noopener"><code>cloudflare_workers_deployment</code><span class="external-link"> ↗</span></a>) resources to more granularly control the lifecycle of each Worker resource.</li> </ul>Thu, 09 Oct 2025 00:00:00 GMTWorkersWorkersWorkers - You can now deploy and manage Workflows in Terraformhttps://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/https://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/<p>You can now create and manage <a href="https://developers.cloudflare.com/workflows/">Workflows</a> using Terraform, now supported in the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow" target="_blank" rel="noopener">Cloudflare Terraform provider v5.11.0<span class="external-link"> ↗</span></a>. Workflows allow you to build durable, multi-step applications -- without needing to worry about retrying failed tasks or managing infrastructure.</p> <p>Now, you can deploy and manage Workflows through Terraform using the new <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow" target="_blank" rel="noopener"><code>cloudflare_workflow</code> resource<span class="external-link"> ↗</span></a>:</p> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workflow"</span><span class="nb-shiki-dzsirb"> "my_workflow"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> workflow_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-workflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> class_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "MyWorkflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-worker"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="examples">Examples</h4><a class="anchor-link" href="#examples"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Here are full examples of how to configure <code>cloudflare_workflow</code> in Terraform, using the existing <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script" target="_blank" rel="noopener"><code>cloudflare_workers_script</code> resource<span class="external-link"> ↗</span></a>, and the beta <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code> resource<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="with-cloudflare_workflow-and-cloudflare_workers_script">With <code>cloudflare_workflow</code> and <code>cloudflare_workers_script</code></h4><a class="anchor-link" href="#with-cloudflare_workflow-and-cloudflare_workers_script"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_script"</span><span class="nb-shiki-dzsirb"> "workflow_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-workflow-worker"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> content_file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "</span><span class="nb-shiki-1itgoe">${</span><span class="nb-shiki-140thh">path</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">module</span><span class="nb-shiki-1itgoe">}</span><span class="nb-shiki-mdbnqw">/../dist/worker/index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_sha256</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> filesha256</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-1itgoe">${</span><span class="nb-shiki-140thh">path</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">module</span><span class="nb-shiki-1itgoe">}</span><span class="nb-shiki-mdbnqw">/../dist/worker/index.js"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "index.js"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workflow"</span><span class="nb-shiki-dzsirb"> "workflow"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> workflow_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-workflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> class_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "MyWorkflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_workers_script</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">workflow_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">script_name</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="with-cloudflare_workflow-and-the-new-beta-resources">With <code>cloudflare_workflow</code>, and the new beta resources</h4><a class="anchor-link" href="#with-cloudflare_workflow-and-the-new-beta-resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can more granularly control the lifecycle of each Worker resource using the beta <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code><span class="external-link"> ↗</span></a> resource, alongside the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker" target="_blank" rel="noopener"><code>cloudflare_worker</code><span class="external-link"> ↗</span></a> and <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment" target="_blank" rel="noopener"><code>cloudflare_workers_deployment</code><span class="external-link"> ↗</span></a> resources.</p> <figure class="nb-code-figure" data-nb-lang="hcl"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="hcl" data-nb-lang="hcl"><code><span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_worker"</span><span class="nb-shiki-dzsirb"> "workflow_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-workflow-worker"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_worker_version"</span><span class="nb-shiki-dzsirb"> "workflow_worker_version"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> worker_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">workflow_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">id</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "index.js"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> modules</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> name </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_file </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "</span><span class="nb-shiki-1itgoe">${</span><span class="nb-shiki-140thh">path</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">module</span><span class="nb-shiki-1itgoe">}</span><span class="nb-shiki-mdbnqw">/../dist/worker/index.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_type </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "application/javascript+module"</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_deployment"</span><span class="nb-shiki-dzsirb"> "workflow_deployment"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">workflow_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">name</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> strategy</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "percentage"</span></span> <span class="line"><span class="nb-shiki-140thh"> versions</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> version_id </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> cloudflare_worker_version.workflow_worker_version.id</span></span> <span class="line"><span class="nb-shiki-140thh"> percentage </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> 100</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workflow"</span><span class="nb-shiki-dzsirb"> "my_workflow"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> var</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">cloudflare_account_id</span></span> <span class="line"><span class="nb-shiki-140thh"> workflow_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-workflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> class_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "MyWorkflow"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> cloudflare_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">workflow_worker</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">name</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="try-it-out">Try it out</h4><a class="anchor-link" href="#try-it-out"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Get started with <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs" target="_blank" rel="noopener">the Cloudflare Terraform provider (v5.11.0)<span class="external-link"> ↗</span></a> and the new <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow" target="_blank" rel="noopener"><code>cloudflare_workflow</code> resource<span class="external-link"> ↗</span></a>.</li> </ul>Thu, 09 Oct 2025 00:00:00 GMTWorkersWorkersCloudflare One Client - WARP client for Linux (version 2025.8.779.0)https://developers.cloudflare.com/changelog/post/2025-10-07-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2025-10-07-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains significant fixes and improvements including an updated public key for Linux packages. The public key must be updated if it was installed before September 12, 2025 to ensure the repository remains functional after December 4, 2025. Instructions to make this update are available at <a href="https://pkg.cloudflareclient.com/">pkg.cloudflareclient.com</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li><p><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> has been enhanced for even faster resolution. Proxy mode now supports SOCKS4, SOCK5, and HTTP CONNECT over an L4 tunnel with custom congestion control optimizations instead of the previous L3 tunnel to Cloudflare&#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.</p> </li> <li><p>The MASQUE protocol is now the only protocol that can use <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a>. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new WARP mode or switch to the MASQUE protocol. Otherwise, all devices matching the profile will lose connectivity.</p> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Tue, 07 Oct 2025 19:20:00 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Windows (version 2025.8.779.0)https://developers.cloudflare.com/changelog/post/2025-10-07-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2025-10-07-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains significant fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li><p><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> has been enhanced for even faster resolution. Proxy mode now supports SOCKS4, SOCK5, and HTTP CONNECT over an L4 tunnel with custom congestion control optimizations instead of the previous L3 tunnel to Cloudflare&#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.</p> </li> <li><p>The MASQUE protocol is now the only protocol that can use <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a>. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new WARP mode or switch to the MASQUE protocol. Otherwise, all devices matching the profile will lose connectivity.</p> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 07 Oct 2025 17:02:40 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.8.779.0)https://developers.cloudflare.com/changelog/post/2025-10-07-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2025-10-07-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains significant fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li><p><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> has been enhanced for even faster resolution. Proxy mode now supports SOCKS4, SOCK5, and HTTP CONNECT over an L4 tunnel with custom congestion control optimizations instead of the previous L3 tunnel to Cloudflare&#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.</p> </li> <li><p>The MASQUE protocol is now the only protocol that can use <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a>. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new WARP mode or switch to the MASQUE protocol. Otherwise, all devices matching the profile will lose connectivity.</p> </li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>macOS Sequoia: Due to changes Apple introduced in macOS 15.0.x, the WARP client may not behave as expected. Cloudflare recommends the use of macOS 15.4 or later.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> </ul> Tue, 07 Oct 2025 17:02:40 GMTCloudflare One ClientCloudflare One ClientCloudflare Fundamentals - Automated reminders for backup codeshttps://developers.cloudflare.com/changelog/post/2025-10-07-recovery-codes/https://developers.cloudflare.com/changelog/post/2025-10-07-recovery-codes/<p>The most common reason users contact Cloudflare support is lost two-factor authentication (2FA) credentials. Cloudflare supports both app-based and hardware keys for 2FA, but you could lose access to your account if you lose these. Over the past few weeks, we have been rolling out email and in-product reminders that remind you to also download backup codes (sometimes called recovery keys) that can get you back into your account in the event you lose your 2FA credentials. Download your backup codes now by logging into Cloudflare, then navigating to <strong>Profile</strong> &gt; <strong>Security &amp; Authentication</strong> &gt; <strong>Backup codes</strong>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sign-in-security-best-practices">Sign-in security best practices</h4><a class="anchor-link" href="#sign-in-security-best-practices"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Cloudflare is critical infrastructure, and you should protect it as such. Please review the following best practices and make sure you are doing your part to secure your account.</p> <ul> <li>Use a unique password for every website, including Cloudflare, and store it in a password manager like 1Password or Keeper. These services are cross-platform and simplify the process of managing secure passwords.</li> <li>Use 2FA to make it harder for an attacker to get into your account in the event your password is leaked</li> <li>Store your backup codes securely. A password manager is the best place since it keeps the backup codes encrypted, but you can also print them and put them somewhere safe in your home.</li> <li>If you use an app to manage your 2FA keys, enable cloud backup, so that you don't lose your keys in the event you lose your phone.</li> <li>If you use a custom email domain to sign in, <a href="https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/" target="_blank" rel="noopener">configure SSO<span class="external-link"> ↗</span></a>.</li> <li>If you use a public email domain like Gmail or Hotmail, you can also use social login with Apple, GitHub, or Google to sign in.</li> <li>If you manage a Cloudflare account for work: <ul> <li>Have at least two administrators in case one of them unexpectedly leaves your company</li> <li>Use SCIM to automate permissions management for members in your Cloudflare account</li> </ul> </li> </ul>Tue, 07 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2025-10-07 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-10-07-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-07-emergency-waf-release/ <p>This week highlights multiple critical Cisco vulnerabilities (CVE-2025-20363, CVE-2025-20333, CVE-2025-20362). This flaw stems from improper input validation in HTTP(S) requests. An authenticated VPN user could send crafted requests to execute code as root, potentially compromising the device. The initial two rules were made available on September 28, with a third rule added today, October 7, for more robust protection.</p> <ul> <li>Cisco (CVE-2025-20333, CVE-2025-20362, CVE-2025-20363): Multiple vulnerabilities that could allow attackers to exploit unsafe deserialization and input validation flaws. Successful exploitation may result in arbitrary code execution, privilege escalation, or command injection on affected systems.</li> </ul> <p><strong>Impact</strong></p> <p>Cisco (CVE-2025-20333, CVE-2025-20362, CVE-2025-20363): Exploitation enables attackers to escalate privileges or achieve remote code execution via command injection. Administrators are strongly advised to apply vendor updates immediately.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="12f808a5315441688f3b7c8a3a4d1bd6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3a4d1bd6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100788B</td><td>Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Tue, 07 Oct 2025 00:00:00 GMTWAFWAFWorkers - New Overview Page for Cloudflare Workershttps://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/https://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1016,format=webp/_astro/workers-overview.BM_exs4R.png" alt="Screenshot of the Workers overview page in the Cloudflare dashboard" loading="lazy" decoding="async" width="1800" height="1016"> <p>Each of your Workers now has a new overview page in the Cloudflare dashboard.</p> <p>The goal is to make it easier to understand your Worker without digging through multiple tabs. Think of it as a new home base, a place to get a high-level overview on what's going on.</p> <p>It's the first place you land when you open a Worker in the dashboard, and it gives you an immediate view of what’s going on. You can see requests, errors, and CPU time at a glance. You can view and add bindings, and see recent versions of your app, including who published them.</p> <p>Navigation is also simpler, with visually distinct tabs at the top of the page. At the bottom right you'll find guided steps for what to do next that are based on the state of your Worker, such as adding a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">binding</a> or connecting a custom domain.</p> <p>We plan to add more here over time. Better insights, more controls, and ways to manage your Worker from one page.</p> <p>If you have feedback or suggestions for the new Overview page or your Cloudflare Workers experience in general, we'd love to hear from you. Join the Cloudflare developer community on <a href="https://discord.com/channels/595317990191398933/1064502845061210152" target="_blank" rel="noopener">Discord<span class="external-link"> ↗</span></a>.</p>Tue, 07 Oct 2025 00:00:00 GMTWorkersWorkersR2, R2 Data Catalog - R2 Data Catalog table-level compactionhttps://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/https://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/<p>You can now enable compaction for individual <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>, giving you fine-grained control over different workloads.</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Enable compaction for a specific table (no token required)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> catalog</span><span class="nb-shiki-mdbnqw"> compaction</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">BUCKE</span><span class="nb-shiki-140thh">T</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">NAMESPAC</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">TABL</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --target-size</span><span class="nb-shiki-dzsirb"> 256</span></span></code></pre></figure> <p>This allows you to:</p> <ul> <li>Apply different target file sizes per table</li> <li>Disable compaction for specific tables</li> <li>Optimize based on table-specific access patterns</li> </ul> <p>Learn more at <a href="https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/">Manage catalogs</a>.</p>Mon, 06 Oct 2025 00:00:00 GMTR2R2R2 Data CatalogRadar - Browser Support Detection for PQ Encryption on Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-10-06-radar-pq-encryption-test/https://developers.cloudflare.com/changelog/post/2025-10-06-radar-pq-encryption-test/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now includes browser detection for Post-quantum (PQ) encryption. The <a href="https://radar.cloudflare.com/adoption-and-usage#post-quantum-encryption" target="_blank" rel="noopener">Post-quantum encryption card<span class="external-link"> ↗</span></a> now checks whether a user’s browser supports post-quantum encryption. If support is detected, information about the key agreement in use is displayed.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=872,height=109,format=webp/_astro/pq-encryption-test.gx_uoaMX.png" alt="Screenshot of the PQ encryption browser support test on the Adoption &amp; Usage page" loading="lazy" decoding="async" width="872" height="109">Mon, 06 Oct 2025 00:00:00 GMTRadarRadarWAF - WAF Release - 2025-10-06https://developers.cloudflare.com/changelog/post/2025-10-06-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-06-waf-release/ <p>This week’s highlights prioritise an emergency Oracle E-Business Suite RCE rule deployed to block active, high-impact exploitation. Also addressed are high-severity Chaos Mesh controller command-injection flaws that enable unauthenticated in-cluster RCE and potential cluster compromise, plus a form-data multipart boundary issue that permits HTTP Parameter Pollution (HPP). Two new generic SQLi detections were added to catch inline-comment obfuscation and information disclosure techniques.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>New emergency rule released for Oracle E-Business Suite (CVE-2025-61882) addressing an actively exploited remote code execution vulnerability in core business application modules. Immediate mitigation deployed to protect enterprise workloads.</p> </li> <li> <p>Chaos Mesh (CVE-2025-59358,CVE-2025-59359,CVE-2025-59360,CVE-2025-59361): A GraphQL debug endpoint on the Chaos Controller Manager is exposed without authentication; several controller mutations (<code>cleanTcs</code>, <code>killProcesses</code>, <code>cleanIptables</code>) are vulnerable to OS command injection.</p> </li> <li> <p>Form-Data (CVE-2025-7783): Attackers who can observe <code>Math.random()</code> outputs and control request fields in form-data may exploit this flaw to perform HTTP parameter pollution, leading to request tampering or data manipulation.</p> </li> <li> <p>Two new generic SQLi detections added to enhance baseline coverage against inline-comment obfuscation and information disclosure attempts.</p> </li> </ul> <p><strong>Impact</strong></p> <ul> <li> <p>CVE-2025-61882 — Oracle E-Business Suite remote code execution (emergency detection): attacker-controlled input can yield full system compromise, data exfiltration, and operational outage; immediate blocking enforced.</p> </li> <li> <p>CVE-2025-59358 / CVE-2025-59359 / CVE-2025-59360 / CVE-2025-59361 — Unauthenticated command-injection in Chaos Mesh controllers allowing remote code execution, cluster compromise, and service disruption (high availability risk).</p> </li> <li> <p>CVE-2025-7783 — Predictable multipart boundaries in form-data enabling HTTP Parameter Pollution; results include request tampering, parameter overwrite, and downstream data integrity loss.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0c9bf31ab6fa41fc8f12daaf8650f52f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8650f52f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100882</td><td>Chaos Mesh - Missing Authentication - CVE:CVE-2025-59358</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5d459ed434ed446c9580c73c2b8c3680"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2b8c3680</span></button></rule-id></td><td>100883</td><td>Chaos Mesh - Command Injection - CVE:CVE-2025-59359</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a2591ba5befa4815a6861aefef859a04"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ef859a04</span></button></rule-id></td><td>100884</td><td>Chaos Mesh - Command Injection - CVE:CVE-2025-59361</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="05eea4fabf6f4cf3aac1094b961f26a7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...961f26a7</span></button></rule-id></td><td>100886</td><td>Form-Data - Parameter Pollution - CVE:CVE-2025-7783</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="90514c7810694b188f56979826a4074c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...26a4074c</span></button></rule-id></td><td>100888</td><td>Chaos Mesh - Command Injection - CVE:CVE-2025-59360</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="42fbc8c09ec84578b9633ffc31101b2f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...31101b2f</span></button></rule-id></td><td>100916</td><td>Oracle E-Business Suite - Remote Code Execution - CVE:CVE-2025-61882</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="badc687a3ba3420a844220b129aa43c3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...29aa43c3</span></button></rule-id></td><td>100917</td><td>Generic Rules - SQLi - Inline Comment Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="28fa27511f29428899ceb5a273c10b6f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...73c10b6f</span></button></rule-id></td><td>100918</td><td>Generic Rules - SQLi - Information Disclosure</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 06 Oct 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-10-03https://developers.cloudflare.com/changelog/post/2025-10-03-waf-release/https://developers.cloudflare.com/changelog/post/2025-10-03-waf-release/ <p><strong>Managed Ruleset Updated</strong></p> <p>This update introduces 21 new detections in the Cloudflare Managed Ruleset (all currently set to Disabled mode to preserve remediation logic and allow quick activation if needed). The rules cover a broad spectrum of threats - SQL injection techniques, command and code injection, information disclosure of common files, URL anomalies, and cross-site scripting.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0d02c2fb14eb4cec9c2e2b58d61fac74"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d61fac74</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100902</td><td>Generic Rules - Command Execution - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c3079865ce9a41368657026b514aeeb8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...514aeeb8</span></button></rule-id></td><td>100908</td><td>Generic Rules - Command Execution - 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="107ae2922b654bb28df7ca978d46a6f4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8d46a6f4</span></button></rule-id></td><td>100910</td><td>Generic Rules - Command Execution - 4</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="68bdb75ae6d24e139a83e5731bd0a329"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1bd0a329</span></button></rule-id></td><td>100915</td><td>Generic Rules - Command Execution - 5</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ea04bb580f7d400386c7dc1d5e51450a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5e51450a</span></button></rule-id></td><td>100899</td><td>Generic Rules - Content-Type Abuse</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="233364f656ff42b8acc41dcd7996012f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7996012f</span></button></rule-id></td><td>100914</td><td>Generic Rules - Content-Type Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1aa695281c954513be3d003b93209312"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...93209312</span></button></rule-id></td><td>100911</td><td>Generic Rules - Cookie Header Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d9f9e4f5bf11489da52dccb40f373b3f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0f373b3f</span></button></rule-id></td><td>100905</td><td>Generic Rules - NoSQL Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5a1897b714e044a887c0f3f078a0ed04"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...78a0ed04</span></button></rule-id></td><td>100913</td><td>Generic Rules - NoSQL Injection - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4d6fd28df4f1494e95e70d2c5d649624"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5d649624</span></button></rule-id></td><td>100907</td><td>Generic Rules - Parameter Pollution</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="61181e3af5304f7396c7d01cfd1c674e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fd1c674e</span></button></rule-id></td><td>100906</td><td>Generic Rules - PHP Object Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ed5190bfbe1b45a6a645126334c88168"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...34c88168</span></button></rule-id></td><td>100904</td><td>Generic Rules - Prototype Pollution</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3ec33bc5ac77495a9f55020e3ab43f7e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3ab43f7e</span></button></rule-id></td><td>100897</td><td>Generic Rules - Prototype Pollution 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c6d752c4909e4b7e8eff6c780d94ee22"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d94ee22</span></button></rule-id></td><td>100903</td><td>Generic Rules - Reverse Shell</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="caf37e7800bb4635bcc2eefcd5add8e3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d5add8e3</span></button></rule-id></td><td>100909</td><td>Generic Rules - Reverse Shell - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="475d090baead467c88dfabbb565c78b0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...565c78b0</span></button></rule-id></td><td>100898</td><td>Generic Rules - SSJI NoSQL</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f4c7f98934264c9c937eec1212b837a0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...12b837a0</span></button></rule-id></td><td>100896</td><td>Generic Rules - SSRF</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="efd01b814d144e90b36522b311c4fb00"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...11c4fb00</span></button></rule-id></td><td>100895</td><td>Generic Rules - Template Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="00a9a0d663da4add95b863abd3ed0123"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d3ed0123</span></button></rule-id></td><td>100895A</td><td>Generic Rules - Template Injection - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e58c0fffee4f4374bd37f2577501a1d9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7501a1d9</span></button></rule-id></td><td>100912</td><td>Generic Rules - XXE</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ab09ba8d00eb4cdbb7a6a65ddc55cdb6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dc55cdb6</span></button></rule-id></td><td>100900</td><td>Relative Paths - Anomaly Headers</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Fri, 03 Oct 2025 00:00:00 GMTWAFWAFWorkers - One-click Cloudflare Access for Workershttps://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/https://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/ <p>You can now enable <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a> for your <a href="https://developers.cloudflare.com/workers/configuration/routing/workers-dev/"><code>workers.dev</code></a> and <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">Preview URLs</a> in a single click.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1016,format=webp/_astro/workers-access.DGGYThLx.png" alt="Screenshot of the Enable/Disable Cloudflare Access button on the workers.dev route settings page" loading="lazy" decoding="async" width="1800" height="1016"> <p>Access allows you to limit access to your Workers to specific users or groups. You can limit access to yourself, your teammates, your organization, or anyone else you specify in your <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Access policy</a>.</p> <p>To enable Cloudflare Access:</p> <ol><li> <p>In the Cloudflare dashboard, go to the <strong>Workers &amp; Pages</strong> page.</p> <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Workers &amp; Pages</strong>&nbsp;&#8599;</a></li> <li> <p>In <strong>Overview</strong>, select your Worker.</p> </li> <li> <p>Go to <strong>Settings</strong> &gt; <strong>Domains &amp; Routes</strong>.</p> </li> <li> <p>For <code>workers.dev</code> or Preview URLs, click <strong>Enable Cloudflare Access</strong>.</p> </li> <li> <p>Optionally, to configure the Access application, click <strong>Manage Cloudflare Access</strong>. There, you can change the email addresses you want to authorize. View <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#selectors">Access policies</a> to learn about configuring alternate rules.</p> </li> </ol> <p>To fully secure your application, it is important that you validate the JWT that Cloudflare Access adds to the <code>Cf-Access-Jwt-Assertion</code> header on the incoming request.</p> <p>The following code will validate the JWT using the <a href="https://www.npmjs.com/package/jose" target="_blank" rel="noopener">jose NPM package<span class="external-link"> ↗</span></a>:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { jwtVerify, createRemoteJWKSet } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "jose"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Verify the POLICY_AUD environment variable is set</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">env.</span><span class="nb-shiki-dzsirb">POLICY_AUD</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Missing required audience"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> status: </span><span class="nb-shiki-dzsirb">403</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Get the JWT from the request headers</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> token</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> request.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"cf-access-jwt-assertion"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Check if token exists</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">token) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Missing required CF Access JWT"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> status: </span><span class="nb-shiki-dzsirb">403</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Create JWKS from your team domain</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> JWKS</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createRemoteJWKSet</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`${</span><span class="nb-shiki-140thh">env</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-dzsirb">TEAM_DOMAIN</span><span class="nb-shiki-mdbnqw">}/cdn-cgi/access/certs`</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Verify the JWT</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">payload</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> jwtVerify</span><span class="nb-shiki-140thh">(token, </span><span class="nb-shiki-dzsirb">JWKS</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> issuer: env.</span><span class="nb-shiki-dzsirb">TEAM_DOMAIN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> audience: env.</span><span class="nb-shiki-dzsirb">POLICY_AUD</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Token is valid, proceed with your application logic</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Hello ${</span><span class="nb-shiki-140thh">payload</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">email</span><span class="nb-shiki-1itgoe"> ||</span><span class="nb-shiki-mdbnqw"> "authenticated user"}!`</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">catch</span><span class="nb-shiki-140thh"> (error) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Token verification failed</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Invalid token: ${</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> status: </span><span class="nb-shiki-dzsirb">403</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="required-environment-variables">Required environment variables</h4><a class="anchor-link" href="#required-environment-variables"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Add these <a href="https://developers.cloudflare.com/workers/configuration/environment-variables/">environment variables</a> to your Worker:</p> <ul> <li><code>POLICY_AUD</code>: Your application's AUD tag</li> <li><code>TEAM_DOMAIN</code>: <code>https://&lt;your-team-name&gt;.cloudflareaccess.com</code></li> </ul> <p>Both of these appear in the modal that appears when you enable Cloudflare Access.</p> <p>You can set these variables by adding them to your Worker's <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">Wrangler configuration file</a>, or via the Cloudflare dashboard under <strong>Workers &amp; Pages</strong> &gt; <strong>your-worker</strong> &gt; <strong>Settings</strong> &gt; <strong>Environment Variables</strong>.</p>Fri, 03 Oct 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Access - Fine-grained Permissioning for Access for Apps, IdPs, & Targets now in Public Betahttps://developers.cloudflare.com/changelog/post/2025-10-01-fine-grained-permissioning-beta/https://developers.cloudflare.com/changelog/post/2025-10-01-fine-grained-permissioning-beta/ <p>Fine-grained permissions for <strong>Access Applications, Identity Providers (IdPs), and Targets</strong> is now available in Public Beta. This expands our RBAC model beyond account &amp; zone-scoped roles, enabling administrators to grant permissions scoped to individual resources.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's New</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/" target="_blank" rel="noopener">Access Applications<span class="external-link"> ↗</span></a></strong>: Grant admin permissions to specific Access Applications.</li> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/" target="_blank" rel="noopener">Identity Providers<span class="external-link"> ↗</span></a></strong>: Grant admin permissions to individual Identity Providers.</li> <li><strong><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/#1-add-a-target" target="_blank" rel="noopener">Targets<span class="external-link"> ↗</span></a></strong>: Grant admin rights to specific Targets</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3004,height=1410,format=webp/_astro/2025-10-01-fine-grained-permissioning-ux.BWVmQsVF.png" alt="Updated Permissions Policy UX" loading="lazy" decoding="async" width="3004" height="1410"><aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>During the public beta, members must also be assigned an account-scoped, read only role to view resources in the dashboard. This restriction will be lifted in a future release.</p><ul> <li><strong>Account Read Only</strong> plus a fine-grained permission for a specific App, IdP, or Target</li> <li><strong>Cloudflare Zero Trust Read Only</strong> plus fine-grained permission for a specific App, IdP, or Target</li> </ul></div></div></aside> <p>For more info:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/">Get started with Cloudflare Permissioning</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/manage">Manage Member Permissioning via the UI &amp; API</a></li> </ul>Thu, 02 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsAccessWorkers AI - New Deepgram Flux model available on Workers AIhttps://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/https://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/<p>Deepgram's newest Flux model <a href="https://developers.cloudflare.com/workers-ai/models/flux/"><code>@cf/deepgram/flux</code></a> is now available on Workers AI, hosted directly on Cloudflare's infrastructure. We're excited to be a launch partner with Deepgram and offer their new Speech Recognition model built specifically for enabling voice agents. Check out <a href="https://deepgram.com/flux" target="_blank" rel="noopener">Deepgram's blog<span class="external-link"> ↗</span></a> for more details on the release.</p> <p>The Flux model can be used in conjunction with Deepgram's speech-to-text model <a href="https://developers.cloudflare.com/workers-ai/models/nova-3/"><code>@cf/deepgram/nova-3</code></a> and text-to-speech model <a href="https://developers.cloudflare.com/workers-ai/models/aura-1/"><code>@cf/deepgram/aura-1</code></a> to build end-to-end voice agents. Having Deepgram on Workers AI takes advantage of our edge GPU infrastructure, for ultra low latency voice AI applications.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="promotional-pricing">Promotional Pricing</h4><a class="anchor-link" href="#promotional-pricing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For the month of October 2025, Deepgram's Flux model will be free to use on Workers AI. Official pricing will be announced soon and charged after the promotional pricing period ends on October 31, 2025. Check out the <a href="https://developers.cloudflare.com/workers-ai/models/flux/">model page</a> for pricing details in the future.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-usage">Example Usage</h4><a class="anchor-link" href="#example-usage"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new Flux model is WebSocket only as it requires live bi-directional streaming in order to recognize speech activity.</p> <ol> <li>Create a worker that establishes a websocket connection with <code>@cf/deepgram/flux</code></li> </ol> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> resp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/deepgram/flux"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> encoding: </span><span class="nb-shiki-mdbnqw">"linear16"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> sample_rate: </span><span class="nb-shiki-mdbnqw">"16000"</span></span> <span class="line"><span class="nb-shiki-140thh"> }, {</span></span> <span class="line"><span class="nb-shiki-140thh"> websocket: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> resp;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure> <ol start="2"> <li>Deploy your worker</li> </ol> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <ol start="3"> <li>Write a client script to connect to your worker and start sending random audio bytes to it</li> </ol> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> ws</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> WebSocket</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'wss://&lt;your-worker-url.com&gt;'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">onopen</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Connected to WebSocket'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Generate and send random audio bytes</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // You can replace this part with a function</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // that reads from your mic or other audio source</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> audioData</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> generateRandomAudio</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> ws.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(audioData);</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Audio data sent'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">onmessage</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Transcription will be received here</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Add your custom logic to parse the data</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Received:'</span><span class="nb-shiki-140thh">, event.data);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">onerror</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'WebSocket error:'</span><span class="nb-shiki-140thh">, error);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">onclose</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'WebSocket closed'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Generate random audio data (1 second of noise at 44.1kHz, mono)</span></span> <span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> generateRandomAudio</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> sampleRate</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> 44100</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> duration</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> 1</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> numSamples</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> sampleRate </span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-140thh"> duration;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> buffer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> ArrayBuffer</span><span class="nb-shiki-140thh">(numSamples </span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-dzsirb"> 2</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> view</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Int16Array</span><span class="nb-shiki-140thh">(buffer);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">let</span><span class="nb-shiki-140thh"> i </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> 0</span><span class="nb-shiki-140thh">; i </span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-140thh"> numSamples; i</span><span class="nb-shiki-1itgoe">++</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> view[i] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> Math.</span><span class="nb-shiki-1t8gfj">floor</span><span class="nb-shiki-140thh">(Math.</span><span class="nb-shiki-1t8gfj">random</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">*</span><span class="nb-shiki-dzsirb"> 65536</span><span class="nb-shiki-1itgoe"> -</span><span class="nb-shiki-dzsirb"> 32768</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> buffer;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure>Thu, 02 Oct 2025 00:00:00 GMTWorkers AIWorkers AIWorkers Analytics Engine, Workers - Workers Analytics Engine adds supports for new SQL functionshttps://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/https://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/<p>You can now perform more powerful queries directly in <a href="https://developers.cloudflare.com/analytics/analytics-engine/" target="_blank" rel="noopener">Workers Analytics Engine<span class="external-link"> ↗</span></a> with a major expansion of our SQL function library.</p> <p>Workers Analytics Engine allows you to ingest and store high-cardinality data at scale (such as custom analytics) and query your data through a simple SQL API.</p> <p>Today, we've expanded Workers Analytics Engine's SQL capabilities with several new functions:</p> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/" target="_blank" rel="noopener"><strong>New aggregate functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>argMin()</code> - Returns the value associated with the minimum in a group</li> <li><code>argMax()</code> - Returns the value associated with the maximum in a group</li> <li><code>topK()</code> - Returns an array of the most frequent values in a group</li> <li><code>topKWeighted()</code> - Returns an array of the most frequent values in a group using weights</li> <li><code>first_value()</code> - Returns the first value in an ordered set of values within a partition</li> <li><code>last_value()</code> - Returns the last value in an ordered set of values within a partition</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/bit-functions/" target="_blank" rel="noopener"><strong>New bit functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>bitAnd()</code> - Returns the bitwise AND of two expressions</li> <li><code>bitCount()</code> - Returns the number of bits set to one in the binary representation of a number</li> <li><code>bitHammingDistance()</code> - Returns the number of bits that differ between two numbers</li> <li><code>bitNot()</code> - Returns a number with all bits flipped</li> <li><code>bitOr()</code> - Returns the inclusive bitwise OR of two expressions</li> <li><code>bitRotateLeft()</code> - Rotates all bits in a number left by specified positions</li> <li><code>bitRotateRight()</code> - Rotates all bits in a number right by specified positions</li> <li><code>bitShiftLeft()</code> - Shifts all bits in a number left by specified positions</li> <li><code>bitShiftRight()</code> - Shifts all bits in a number right by specified positions</li> <li><code>bitTest()</code> - Returns the value of a specific bit in a number</li> <li><code>bitXor()</code> - Returns the bitwise exclusive-or of two expressions</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/mathematical-functions/" target="_blank" rel="noopener"><strong>New mathematical functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>abs()</code> - Returns the absolute value of a number</li> <li><code>log()</code> - Computes the natural logarithm of a number</li> <li><code>round()</code> - Rounds a number to a specified number of decimal places</li> <li><code>ceil()</code> - Rounds a number up to the nearest integer</li> <li><code>floor()</code> - Rounds a number down to the nearest integer</li> <li><code>pow()</code> - Returns a number raised to the power of another number</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/string-functions/" target="_blank" rel="noopener"><strong>New string functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>lowerUTF8()</code> - Converts a string to lowercase using UTF-8 encoding</li> <li><code>upperUTF8()</code> - Converts a string to uppercase using UTF-8 encoding</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/encoding-functions/" target="_blank" rel="noopener"><strong>New encoding functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>hex()</code> - Converts a number to its hexadecimal representation</li> <li><code>bin()</code> - Converts a string to its binary representation</li> </ul> <p><a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/type-conversion-functions/" target="_blank" rel="noopener"><strong>New type conversion functions:</strong><span class="external-link"> ↗</span></a></p> <ul> <li><code>toUInt8()</code> - Converts any numeric expression, or expression resulting in a string representation of a decimal, into an unsigned 8 bit integer</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ready-to-get-started">Ready to get started?</h4><a class="anchor-link" href="#ready-to-get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Whether you're building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. <a href="https://developers.cloudflare.com/analytics/analytics-engine/get-started/">Get started </a> with Workers Analytics Engine and explore all available functions in our <a href="https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/">SQL reference documentation</a>.</p>Thu, 02 Oct 2025 00:00:00 GMTWorkers Analytics EngineWorkers Analytics EngineWorkersAnalytics - New Confidence Intervals in GraphQL Analytics APIhttps://developers.cloudflare.com/changelog/post/2025-10-01-confidence-intervals/https://developers.cloudflare.com/changelog/post/2025-10-01-confidence-intervals/<p>The GraphQL Analytics API now supports confidence intervals for <code>sum</code> and <code>count</code> fields on adaptive (sampled) datasets. Confidence intervals provide a statistical range around sampled results, helping verify accuracy and quantify uncertainty.</p> <ul> <li><strong>Supported datasets</strong>: Adaptive (sampled) datasets only.</li> <li><strong>Supported fields</strong>: All <code>sum</code> and <code>count</code> fields.</li> <li><strong>Usage</strong>: The confidence <code>level</code> must be provided as a decimal between 0 and 1 (e.g. <code>0.90</code>, <code>0.95</code>, <code>0.99</code>).</li> <li><strong>Default</strong>: If no confidence level is specified, no intervals are returned.</li> </ul> <p>For examples and more details, see the <a href="https://developers.cloudflare.com/analytics/graphql-api/features/confidence-intervals/">GraphQL Analytics API documentation</a>.</p>Wed, 01 Oct 2025 00:00:00 GMTAnalyticsAnalyticsContainers - Larger Container instance typeshttps://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/https://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/<p>New instance types provide up to 4 vCPU, 12 GiB of memory, and 20 GB of disk per container instance.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Instance Type</th> <th>vCPU</th> <th>Memory</th> <th>Disk</th> </tr> </thead> <tbody> <tr> <td>lite</td> <td>1/16</td> <td>256 MiB</td> <td>2 GB</td> </tr> <tr> <td>basic</td> <td>1/4</td> <td>1 GiB</td> <td>4 GB</td> </tr> <tr> <td>standard-1</td> <td>1/2</td> <td>4 GiB</td> <td>8 GB</td> </tr> <tr> <td>standard-2</td> <td>1</td> <td>6 GiB</td> <td>12 GB</td> </tr> <tr> <td>standard-3</td> <td>2</td> <td>8 GiB</td> <td>16 GB</td> </tr> <tr> <td>standard-4</td> <td>4</td> <td>12 GiB</td> <td>20 GB</td> </tr> </tbody> </table></div> <p>The <code>dev</code> and <code>standard</code> instance types are preserved for backward compatibility and are aliases for <code>lite</code> and <code>standard-1</code>, respectively. The <code>standard-1</code> instance type now provides up to 8 GB of disk instead of only 4 GB.</p> <p>See the <a href="https://developers.cloudflare.com/containers/get-started/">getting started guide</a> to deploy your first Container, and the <a href="https://developers.cloudflare.com/containers/platform-details/limits/">limits documentation</a> for more details on the available instance types and limits.</p>Wed, 01 Oct 2025 00:00:00 GMTContainersContainersData Loss Prevention - Expanded File Type Controls for Executables and Disk Imageshttps://developers.cloudflare.com/changelog/post/2025-10-01-new-file-type-support/https://developers.cloudflare.com/changelog/post/2025-10-01-new-file-type-support/<p>You can now enhance your security posture by blocking additional application installer and disk image file types with Cloudflare Gateway. Preventing the download of unauthorized software packages is a critical step in securing endpoints from malware and unwanted applications.</p> <p>We have expanded Gateway's file type controls to include:</p> <ul> <li>Apple Disk Image (dmg)</li> <li>Microsoft Software Installer (msix, appx)</li> <li>Apple Software Package (pkg)</li> </ul> <p>You can find these new options within the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#download-and-upload-file-types"><em>Upload File Types</em> and <em>Download File Types</em> selectors</a> when creating or editing an HTTP policy. The file types are categorized as follows:</p> <ul> <li><strong>System</strong>: <em>Apple Disk Image (dmg)</em></li> <li><strong>Executable</strong>: <em>Microsoft Software Installer (msix)</em>, <em>Microsoft Software Installer (appx)</em>, <em>Apple Software Package (pkg)</em></li> </ul> <p>To ensure these file types are blocked effectively, please note the following behaviors:</p> <ul> <li>DMG: Due to their file structure, DMG files are blocked at the very end of the transfer. A user's download may appear to progress but will fail at the last moment, preventing the browser from saving the file.</li> <li>MSIX: To comprehensively block Microsoft Software Installers, you should also include the file type <em>Unscannable</em>. MSIX files larger than 100 MB are identified as Unscannable ZIP files during inspection.</li> </ul> <p>To get started, go to your HTTP policies in Zero Trust. For a full list of file types, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#supported-file-types">supported file types</a>.</p>Wed, 01 Oct 2025 00:00:00 GMTData Loss PreventionData Loss PreventionCloudflare Fundamentals - Return markdownhttps://developers.cloudflare.com/changelog/post/2025-10-01-md-returned/https://developers.cloudflare.com/changelog/post/2025-10-01-md-returned/<p>Users can now specify that they want to retrieve Cloudflare documentation as markdown rather than the previous HTML default. This can significantly reduce token consumption when used alongside Large Language Model (LLM) tools.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://developers.cloudflare.com/workers/</span><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Accept: text/markdown'</span><span class="nb-shiki-dzsirb"> -v</span></span></code></pre></figure> <p>If you maintain your own site and want to adopt this practice using Cloudflare Workers for your own users you can follow the example <a href="https://github.com/cloudflare/cloudflare-docs/pull/25493" target="_blank" rel="noopener">here<span class="external-link"> ↗</span></a>.</p>Wed, 01 Oct 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare One Client - WARP client for Windows (version 2025.7.176.0)https://developers.cloudflare.com/changelog/post/2025-09-30-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2025-09-30-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>MASQUE is now the default <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">tunnel protocol</a> for all new WARP device profiles.</li> <li>Improvement to limit idle connections in <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode">Gateway with DoH mode</a> to avoid unnecessary resource usage that can lead to DoH requests not resolving.</li> <li>Improvement to maintain TCP connections to reduce interruptions in long-lived connections such as RDP or SSH.</li> <li>Improvements to maintain <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices">Global WARP override</a> settings when <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/#switch-organizations-in-the-cloudflare-one-client">switching between organizations</a>.</li> <li>Improvements to maintain client connectivity during network changes.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 30 Sep 2025 20:43:09 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.7.176.0)https://developers.cloudflare.com/changelog/post/2025-09-30-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2025-09-30-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed a bug preventing the <code>warp-diag captive-portal</code> command from running successfully due to the client not parsing SSID on macOS.</li> <li>Improvements to maintain <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices">Global WARP override</a> settings when <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/#switch-organizations-in-the-cloudflare-one-client">switching between organizations</a>.</li> <li>MASQUE is now the default <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">tunnel protocol</a> for all new WARP device profiles.</li> <li>Improvement to limit idle connections in <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode">Gateway with DoH mode</a> to avoid unnecessary resource usage that can lead to DoH requests not resolving.</li> <li>Improvements to maintain client connectivity during network changes.</li> <li>The WARP client now supports macOS Tahoe (version 26.0).</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>macOS Sequoia: Due to changes Apple introduced in macOS 15.0.x, the WARP client may not behave as expected. Cloudflare recommends the use of macOS 15.4 or later.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> </ul> Tue, 30 Sep 2025 20:43:08 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Linux (version 2025.7.176.0)https://developers.cloudflare.com/changelog/post/2025-09-30-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2025-09-30-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements including an updated public key for Linux packages. The public key must be updated if it was installed before September 12, 2025 to ensure the repository remains functional after December 4, 2025. Instructions to make this update are available at <a href="https://pkg.cloudflareclient.com/">pkg.cloudflareclient.com</a>.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>MASQUE is now the default <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">tunnel protocol</a> for all new WARP device profiles.</li> <li>Improvement to limit idle connections in <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode">Gateway with DoH mode</a> to avoid unnecessary resource usage that can lead to DoH requests not resolving.</li> <li>Improvements to maintain <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices">Global WARP override</a> settings when <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/#switch-organizations-in-the-cloudflare-one-client">switching between organizations</a>.</li> <li>Improvements to maintain client connectivity during network changes.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Tue, 30 Sep 2025 20:20:30 GMTCloudflare One ClientCloudflare One ClientGateway - Application granular controls for operations in SaaS applicationshttps://developers.cloudflare.com/changelog/post/2025-09-25-new-granular-controls-for-saas-applications/https://developers.cloudflare.com/changelog/post/2025-09-25-new-granular-controls-for-saas-applications/<p>Gateway users can now apply granular controls to their file sharing and AI chat applications through <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies">HTTP policies</a>.</p> <p>The new feature offers two methods of controlling SaaS applications:</p> <ul> <li><strong>Application Controls</strong> are curated groupings of Operations which provide an easy way for users to achieve a specific outcome. Application Controls may include <em>Upload</em>, <em>Download</em>, <em>Prompt</em>, <em>Voice</em>, and <em>Share</em> depending on the application.</li> <li><strong>Operations</strong> are controls aligned to the most granular action a user can take. This provides a fine-grained approach to enforcing policy and generally aligns to the SaaS providers API specifications in naming and function.</li> </ul> <p>Get started using <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/granular-controls">Application Granular Controls</a> and refer to the list of <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/granular-controls/#compatible-applications">supported applications</a>.</p>Tue, 30 Sep 2025 00:00:00 GMTGatewayGatewayRadar - Regional Data in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-09-29-radar-regional-data/https://developers.cloudflare.com/changelog/post/2025-09-29-radar-regional-data/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now introduces Regional Data, providing traffic insights that bring a more localized perspective to the traffic trends shown on Radar.</p> <p>The following API endpoints are now available:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/geolocations/methods/get/"><code>Get Geolocation</code></a> - Retrieves geolocation by <code>geoId</code>.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/geolocations/methods/list/"><code>List Geolocations</code></a> - Lists geolocations.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/netflows/methods/summary_v2/"><code>NetFlows Summary By Dimension</code></a> - Retrieves NetFlows summary by dimension.</li> </ul> <p>All <code>summary</code> and <code>timeseries_groups</code> endpoints in <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/"><code>HTTP</code></a> and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/netflows/"><code>NetFlows</code></a> now include an <code>adm1</code> dimension for grouping data by first level administrative division (for example, state, province, etc.)</p> <p>A new filter <code>geoId</code> was also added to all endpoints in <a href="https://developers.cloudflare.com/api/resources/radar/subresources/http/"><code>HTTP</code></a> and <a href="https://developers.cloudflare.com/api/resources/radar/subresources/netflows/"><code>NetFlows</code></a>, allowing filtering by a specific administrative division.</p> <p>Check out the new Regional traffic insights on a country specific traffic page <a href="https://radar.cloudflare.com/traffic/pt" target="_blank" rel="noopener">new Radar page<span class="external-link"> ↗</span></a>.</p>Mon, 29 Sep 2025 00:00:00 GMTRadarRadarWAF - WAF Release - 2025-09-29https://developers.cloudflare.com/changelog/post/2025-09-29-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-29-waf-release/ <p>This week highlights four important vendor- and component-specific issues: an authentication bypass in SimpleHelp (CVE-2024-57727), an information-disclosure flaw in Flowise Cloud (CVE-2025-58434), an SSRF in the WordPress plugin Ditty (CVE-2025-8085), and a directory-traversal bug in Vite (CVE-2025-30208). These are paired with improvements to our generic detection coverage (SQLi, SSRF) to raise the baseline and reduce noisy gaps.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>SimpleHelp (CVE-2024-57727): Authentication bypass in SimpleHelp that can allow unauthorized access to management interfaces or sessions.</p> </li> <li> <p>Flowise Cloud (CVE-2025-58434): Information-disclosure vulnerability in Flowise Cloud that may expose sensitive configuration or user data to unauthenticated or low-privileged actors.</p> </li> <li> <p>WordPress:Plugin: Ditty (CVE-2025-8085): SSRF in the Ditty WordPress plugin enabling server-side requests that could reach internal services or cloud metadata endpoints.</p> </li> <li> <p>Vite (CVE-2025-30208): Directory-traversal vulnerability in Vite allowing access to filesystem paths outside the intended web root.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities allow attackers to gain access, escalate privileges, or execute actions that were previously unavailable:</p> <ul> <li> <p>SimpleHelp (CVE-2024-57727): An authentication bypass that can let unauthenticated attackers access management interfaces or hijack sessions — enabling lateral movement, credential theft, or privilege escalation within affected environments.</p> </li> <li> <p>Flowise Cloud (CVE-2025-58434): Information-disclosure flaw that can expose sensitive configuration, tokens, or user data; leaked secrets may be chained into account takeover or privileged access to backend services.</p> </li> <li> <p>WordPress:Plugin: Ditty (CVE-2025-8085): SSRF that enables server-side requests to internal services or cloud metadata endpoints, potentially allowing attackers to retrieve credentials or reach otherwise inaccessible infrastructure, leading to privilege escalation or cloud resource compromise.</p> </li> <li> <p>Vite (CVE-2025-30208): Directory-traversal vulnerability that can expose filesystem contents outside the web root (configuration files, keys, source code), which attackers can use to escalate privileges or further compromise systems.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6fe90532af50427484a5275c8c2e30fb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8c2e30fb</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100717</td><td>SimpleHelp - Auth Bypass - CVE:CVE-2024-57727</td><td>Log</td><td>Block</td><td>This rule is merged to 100717 in legacy WAF and <rule-id id="498fcd81a62a4b5ca943e2de958094d3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...958094d3</span></button></rule-id> in new WAF</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="013ef5de3f074fd5a43cdd70d58b886b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d58b886b</span></button></rule-id></td><td>100775</td><td>Flowise Cloud - Information Disclosure - CVE:CVE-2025-58434</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="68fc5c086ccb4b40a35a63b19bce1ff4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9bce1ff4</span></button></rule-id></td><td>100881</td><td>WordPress:Plugin:Ditty - SSRF - CVE:CVE-2025-8085</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9e1a56e6b3bc49b187bf6e35ddc329dd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ddc329dd</span></button></rule-id></td><td>100887</td><td>Vite - Directory Traversal - CVE:CVE-2025-30208</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 29 Sep 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-09-28 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-09-28-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-28-emergency-waf-release/ <p>This week highlights multiple critical Cisco vulnerabilities (CVE-2025-20363, CVE-2025-20333, CVE-2025-20362). This flaw stems from improper input validation in HTTP(S) requests. An authenticated VPN user could send crafted requests to execute code as root, potentially compromising the device.</p> <p><strong>Key Findings</strong></p> <ul> <li>Cisco (CVE-2025-20333, CVE-2025-20362, CVE-2025-20363): Multiple vulnerabilities that could allow attackers to exploit unsafe deserialization and input validation flaws. Successful exploitation may result in arbitrary code execution, privilege escalation, or command injection on affected systems.</li> </ul> <p><strong>Impact</strong></p> <p>Cisco (CVE-2025-20333, CVE-2025-20362, CVE-2025-20363): Exploitation enables attackers to escalate privileges or achieve remote code execution via command injection.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a1bef4ada0b146d2862cad439ee0ab84"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9ee0ab84</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100788</td><td>Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="51de6ce6596a40eb8200452ad30f768e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d30f768e</span></button></rule-id></td><td>100788A</td><td>Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Sun, 28 Sep 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-09-26https://developers.cloudflare.com/changelog/post/2025-09-26-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-26-waf-release/ <p><strong>Managed Ruleset Updated</strong></p> <p>This update introduces 11 new detections in the Cloudflare Managed Ruleset (all currently set to Disabled mode to preserve remediation logic and allow quick activation if needed). The rules cover a broad spectrum of threats - SQL injection techniques, command and code injection, information disclosure of common files, URL anomalies, and cross-site scripting.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3ffd242b4ba242ca965022d3a67d8561"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a67d8561</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100859A</td><td>SQLi - UNION - 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="91d9cf56355b4ab88481b2fd4de80468"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4de80468</span></button></rule-id></td><td>100889</td><td>Command Injection - Generic 9</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c15ca8e8290f485287037665f2be3ddf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f2be3ddf</span></button></rule-id></td><td>100890</td><td>Information Disclosure - Common Files - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="56669615f2984c2cac8c608980a252a8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...80a252a8</span></button></rule-id></td><td>100891</td><td>Anomaly:URL - Relative Paths</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c41789fb6370431d809567d17e7d3865"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7e7d3865</span></button></rule-id></td><td>100894</td><td>XSS - Inline Function</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b995d0b930604fa6b8d9b2a13792565c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3792565c</span></button></rule-id></td><td>100895</td><td>XSS - DOM</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ab8277e3f432400bbd9403dd42978e38"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...42978e38</span></button></rule-id></td><td>100896</td><td>SQLi - MSSQL Length Enumeration</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3ec33bc5ac77495a9f55020e3ab43f7e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3ab43f7e</span></button></rule-id></td><td>100897</td><td>Generic Rules - Code Injection - 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4375dc90c7af4c55908f6b95c1686741"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c1686741</span></button></rule-id></td><td>100898</td><td>SQLi - Evasion</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="945c5aa9f45141dd872d7ec920999be0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...20999be0</span></button></rule-id></td><td>100899</td><td>SQLi - Probing 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2c20b5e8684043f48620ff77b4026c88"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b4026c88</span></button></rule-id></td><td>100900</td><td>SQLi - Probing</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Fri, 26 Sep 2025 00:00:00 GMTWAFWAFWorkers - Automatic loopback bindings via ctx.exportshttps://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/https://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/<p>The <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#exports"><code>ctx.exports</code> API</a> contains automatically-configured bindings corresponding to your Worker's top-level exports. For each top-level export extending <code>WorkerEntrypoint</code>, <code>ctx.exports</code> will contain a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings">Service Binding</a> by the same name, and for each export extending <code>DurableObject</code> (and for which storage has been configured via a <a href="https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/">migration</a>), <code>ctx.exports</code> will contain a <a href="https://developers.cloudflare.com/durable-objects/api/namespace/">Durable Object namespace binding</a>. This means you no longer have to configure these bindings explicitly in <code>wrangler.jsonc</code>/<code>wrangler.toml</code>.</p> <p>Example:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkerEntrypoint } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> Greeter</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkerEntrypoint</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> greet</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">name</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> `Hello, ${</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}!`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> greeting </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ctx.exports.Greeter.</span><span class="nb-shiki-1t8gfj">greet</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"World"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(greeting);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>At present, you must use <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags#enable-ctxexports">the <code>enable_ctx_exports</code> compatibility flag</a> to enable this API, though it will be on by default in the future.</p> <p><a href="https://developers.cloudflare.com/workers/runtime-apis/context/#exports">See the API reference for more information.</a></p> Fri, 26 Sep 2025 00:00:00 GMTWorkersWorkersPipelines - Pipelines now supports SQL transformations and Apache Iceberghttps://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/https://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/ <p>Today, we're launching the new <a href="https://developers.cloudflare.com/pipelines/">Cloudflare Pipelines</a>: a streaming data platform that ingests events, transforms them with <a href="https://developers.cloudflare.com/pipelines/sql-reference/select-statements/">SQL</a>, and writes to <a href="https://developers.cloudflare.com/r2/">R2</a> as <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables or Parquet files.</p> <p>Pipelines can receive events via <a href="https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-http">HTTP endpoints</a> or <a href="https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers">Worker bindings</a>, transform them with SQL, and deliver to R2 with exactly-once guarantees. This makes it easy to build analytics-ready warehouses for server logs, mobile application events, IoT telemetry, or clickstream data without managing streaming infrastructure.</p> <p>For example, here's a pipeline that ingests clickstream events and filters out bot traffic while extracting domain information:</p> <figure class="nb-code-figure" data-nb-lang="sql"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sql" data-nb-lang="sql"><code><span class="line"><span class="nb-shiki-1itgoe">INSERT into</span><span class="nb-shiki-140thh"> events_table</span></span> <span class="line"><span class="nb-shiki-1itgoe">SELECT</span></span> <span class="line"><span class="nb-shiki-140thh"> user_id,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> lower</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> event_type,</span></span> <span class="line"><span class="nb-shiki-140thh"> to_timestamp_micros(ts_us) </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> event_time,</span></span> <span class="line"><span class="nb-shiki-140thh"> regexp_match(</span><span class="nb-shiki-1itgoe">url</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'^https?://([^/]+)'</span><span class="nb-shiki-140thh">)[1] </span><span class="nb-shiki-1itgoe">AS</span><span class="nb-shiki-140thh"> domain,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> url</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> referrer,</span></span> <span class="line"><span class="nb-shiki-140thh"> user_agent</span></span> <span class="line"><span class="nb-shiki-1itgoe">FROM</span><span class="nb-shiki-140thh"> events_json</span></span> <span class="line"><span class="nb-shiki-1itgoe">WHERE</span><span class="nb-shiki-1itgoe"> event</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> 'page_view'</span></span> <span class="line"><span class="nb-shiki-1itgoe"> AND</span><span class="nb-shiki-1itgoe"> NOT</span><span class="nb-shiki-140thh"> regexp_like(user_agent, </span><span class="nb-shiki-mdbnqw">'(?i)bot|spider'</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Get started by creating a pipeline in the dashboard or running a single command in <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> pipelines</span><span class="nb-shiki-mdbnqw"> setup</span></span></code></pre></figure> <p>Check out our <a href="https://developers.cloudflare.com/pipelines/getting-started/">getting started guide</a> to learn how to create a pipeline that delivers events to an <a href="https://developers.cloudflare.com/r2-data-catalog/">Iceberg table</a> you can query with R2 SQL. Read more about today's announcement in our <a href="https://blog.cloudflare.com/cloudflare-data-platform" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Thu, 25 Sep 2025 13:00:00 GMTPipelinesPipelinesR2 SQL - Announcing R2 SQLhttps://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/ <p>Today, we're launching the <strong>open beta</strong> for <a href="https://developers.cloudflare.com/r2-sql/">R2 SQL</a>: A serverless, distributed query engine that can efficiently analyze petabytes of data in <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables managed by <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a>.</p> <p>R2 SQL is ideal for exploring analytical and time-series data stored in R2, such as logs, events from <a href="https://developers.cloudflare.com/pipelines/">Pipelines</a>, or clickstream and user behavior data.</p> <p>If you already have a table in R2 Data Catalog, running queries is as simple as:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> sql</span><span class="nb-shiki-mdbnqw"> query</span><span class="nb-shiki-mdbnqw"> YOUR_WAREHOUSE</span><span class="nb-shiki-mdbnqw"> "</span></span> <span class="line"><span class="nb-shiki-mdbnqw">SELECT</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> user_id,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> event_type,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> value</span></span> <span class="line"><span class="nb-shiki-mdbnqw">FROM events.user_events</span></span> <span class="line"><span class="nb-shiki-mdbnqw">WHERE event_type = 'CHANGELOG' or event_type = 'BLOG'</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> AND __ingest_ts &gt; '2025-09-24T00:00:00Z'</span></span> <span class="line"><span class="nb-shiki-mdbnqw">ORDER BY __ingest_ts DESC</span></span> <span class="line"><span class="nb-shiki-mdbnqw">LIMIT 100"</span></span></code></pre></figure> <p>To get started with R2 SQL, check out our <a href="https://developers.cloudflare.com/r2-sql/get-started/">getting started guide</a> or learn more about supported features in the <a href="https://developers.cloudflare.com/r2-sql/sql-reference/">SQL reference</a>. For a technical deep dive into how we built R2 SQL, read our <a href="https://blog.cloudflare.com/r2-sql-deep-dive/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Thu, 25 Sep 2025 13:00:00 GMTR2 SQLR2 SQLBrowser Run - Browser Rendering Playwright GA, Stagehand support (Beta), and higher limitshttps://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/https://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/<p>We’re shipping three updates to Browser Rendering:</p> <ul> <li>Playwright support is now Generally Available and synced with <a href="https://playwright.dev/docs/release-notes#version-155" target="_blank" rel="noopener">Playwright v1.55<span class="external-link"> ↗</span></a>, giving you a stable foundation for critical automation and AI-agent workflows.</li> <li>We’re also adding <a href="https://developers.cloudflare.com/browser-run/stagehand/">Stagehand support (Beta)</a> so you can combine code with natural language instructions to build more resilient automations.</li> <li>Finally, we’ve tripled <a href="https://developers.cloudflare.com/browser-run/limits/#workers-paid">limits</a> for paid plans across both the <a href="https://developers.cloudflare.com/browser-run/quick-actions/">REST API</a> and <a href="https://developers.cloudflare.com/browser-run/#integration-methods">Browser Sessions</a> to help you scale.</li> </ul> <p>To get started with Stagehand, refer to the <a href="https://developers.cloudflare.com/browser-run/stagehand/">Stagehand</a> example that uses Stagehand and <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> to search for a movie on this <a href="https://demo.playwright.dev/movies" target="_blank" rel="noopener">example movie directory<span class="external-link"> ↗</span></a>, extract its details using natural language (title, year, rating, duration, and genre), and return the information along with a screenshot of the webpage.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">Stagehand example</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stagehand</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Stagehand</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> env: </span><span class="nb-shiki-mdbnqw">"LOCAL"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> localBrowserLaunchOptions: { cdpUrl: </span><span class="nb-shiki-1t8gfj">endpointURLString</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">) },</span></span> <span class="line"><span class="nb-shiki-140thh"> llmClient: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> WorkersAIClient</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> verbose: </span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> stagehand.</span><span class="nb-shiki-1t8gfj">init</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> page</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> stagehand.page;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">goto</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://demo.playwright.dev/movies"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// if search is a multi-step action, stagehand will return an array of actions it needs to act on</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> actions</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">observe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Search for "Furiosa"'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> action</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> actions) </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">act</span><span class="nb-shiki-140thh">(action);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">act</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Click the search result"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// normal playwright functions work as expected</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">waitForSelector</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">".info-wrapper .cast"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">let</span><span class="nb-shiki-140thh"> movieInfo </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">extract</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> instruction: </span><span class="nb-shiki-mdbnqw">"Extract movie information"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> schema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> title: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> year: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> rating: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> genres: z.</span><span class="nb-shiki-1t8gfj">array</span><span class="nb-shiki-140thh">(z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">()),</span></span> <span class="line"><span class="nb-shiki-140thh"> duration: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">describe</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Duration in minutes"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> stagehand.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <img src="https://developers.cloudflare.com/images/browser-run/speedystagehand.gif" alt="Stagehand video">Thu, 25 Sep 2025 12:00:00 GMTBrowser RunBrowser RunAI Search - AI Search (formerly AutoRAG) now with More Models To Choose Fromhttps://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/https://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/<p>AutoRAG is now AI Search! The new name marks a new and bigger mission: to make world-class search infrastructure available to every developer and business.</p> <p>With AI Search you can now use models from different providers like OpenAI and Anthropic. By attaching your provider keys to the AI Gateway linked to your AI Search instance, you can use many more models for both embedding and inference.</p> <p>To use AI Search with other <a href="https://developers.cloudflare.com/ai-search/configuration/models/">model providers</a>:</p> <ol> <li><strong>Add provider keys to AI Gateway</strong> <ol> <li>Go to AI &gt; AI Gateway in the dashboard.</li> <li>Select or create an AI gateway.</li> <li>In Provider Keys, choose your provider, click Add, and enter the key.</li> </ol> </li> <li><strong>Connect a gateway to AI Search</strong>: When creating a new AI Search, select the AI Gateway with your provider keys. For an existing AI Search, go to Settings and switch to a gateway that has your keys under Resources.</li> <li><strong>Select models</strong>: Embedding models are only available to be changed when creating a new AI Search. Generation model can be selected when creating a new AI Search and can be changed at any time in Settings.</li> </ol> <p>Once configured, your AI Search instance will be able to reference models available through your AI Gateway when making a <code>/ai-search</code> request:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> </span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Query your AI Search instance with a natural language question to an OpenAI model</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">autorag</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-ai-search"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">aiSearch</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> query: </span><span class="nb-shiki-mdbnqw">"What's new for Cloudflare Birthday Week?"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"openai/gpt-5"</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return only the generated answer as plain text</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(result.response, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>In the coming weeks we will also roll out updates to align the APIs with the new name. The existing APIs will continue to be supported for the time being. Stay tuned to the <a href="https://developers.cloudflare.com/changelog/product/ai-search/">AI Search Changelog</a> and <a href="https://discord.cloudflare.com/" target="_blank" rel="noopener">Discord<span class="external-link"> ↗</span></a> for more updates!</p>Thu, 25 Sep 2025 00:00:00 GMTAI SearchAI SearchContainers - Run more Containers with higher resource limitshttps://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/https://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/<p>You can now run more Containers concurrently with higher limits on CPU, memory, and disk.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Limit</th> <th>New Limit</th> <th>Previous Limit</th> </tr> </thead> <tbody> <tr> <td>Memory for concurrent live Container instances</td> <td>400GiB</td> <td>40GiB</td> </tr> <tr> <td>vCPU for concurrent live Container instances</td> <td>100</td> <td>20</td> </tr> <tr> <td>Disk for concurrent live Container instances</td> <td>2TB</td> <td>100GB</td> </tr> </tbody> </table></div> <p>You can now run 1000 instances of the <code>dev</code> instance type, 400 instances of <code>basic</code>, or 100 instances of <code>standard</code> concurrently.</p> <p>This opens up new possibilities for running larger-scale workloads on Containers.</p> <p>See the <a href="https://developers.cloudflare.com/containers/get-started/">getting started guide</a> to deploy your first Container, and the <a href="https://developers.cloudflare.com/containers/platform-details/limits/">limits documentation</a> for more details on the available instance types and limits.</p>Thu, 25 Sep 2025 00:00:00 GMTContainersContainersGateway, Data Loss Prevention - Refine DLP Scans with New Body Phase Selectorhttps://developers.cloudflare.com/changelog/post/2025-09-25-body-phase-selector/https://developers.cloudflare.com/changelog/post/2025-09-25-body-phase-selector/<p>You can now more precisely control your HTTP DLP policies by specifying whether to scan the request or response body, helping to reduce false positives and target specific data flows.</p> <p>In the Gateway HTTP policy builder, you will find a new selector called <em>Body Phase</em>. This allows you to define the direction of traffic the DLP engine will inspect:</p> <ul> <li><em>Request Body</em>: Scans data sent from a user's machine to an upstream service. This is ideal for monitoring data uploads, form submissions, or other user-initiated data exfiltration attempts.</li> <li><em>Response Body</em>: Scans data sent to a user's machine from an upstream service. Use this to inspect file downloads and website content for sensitive data.</li> </ul> <p>For example, consider a policy that blocks Social Security Numbers (SSNs). Previously, this policy might trigger when a user visits a website that contains example SSNs in its content (the response body). Now, by setting the <strong>Body Phase</strong> to <em>Request Body</em>, the policy will only trigger if the user attempts to upload or submit an SSN, ignoring the content of the web page itself.</p> <p>All policies without this selector will continue to scan both request and response bodies to ensure continued protection.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#body-phase">Gateway HTTP policy selectors</a>.</p>Thu, 25 Sep 2025 00:00:00 GMTGatewayGatewayData Loss PreventionCloudflare Fundamentals - Sign in with GitHubhttps://developers.cloudflare.com/changelog/post/2025-09-25-sign-in-with-github/https://developers.cloudflare.com/changelog/post/2025-09-25-sign-in-with-github/<p>Cloudflare has launched sign in with GitHub as a log in option. This feature is available to all users with a verified email address who are not using SSO. To use it, simply click on the <code>Sign in with GitHub</code> button on the dashboard login page. You will be logged in with your primary GitHub email address.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/user-profiles/login/">Log in to Cloudflare</a></li> </ul>Thu, 25 Sep 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsCloudflare Fundamentals - SSO for allhttps://developers.cloudflare.com/changelog/post/2025-09-25-sso-for-all/https://developers.cloudflare.com/changelog/post/2025-09-25-sso-for-all/<p>Single sign-on (SSO) streamlines the process of logging into Cloudflare for Enterprise customers who manage a custom email domain and manage their own identity provider. Instead of managing a password and two-factor authentication credentials directly for Cloudflare, SSO lets you reuse your existing login infrastructure to seamlessly log in. SSO also provides additional security opportunities such as device health checks which are not available natively within Cloudflare.</p> <p>Historically, SSO was only available for Enterprise accounts. Today, we are announcing that we are making SSO available to all users for free. We have also added the ability to directly manage SSO configurations using the API. This removes the previous requirement to contact support to configure SSO.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://blog.cloudflare.com/enterprise-grade-features-for-all/" target="_blank" rel="noopener">Every Cloudflare feature, available to all<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/">Configure Dashboard SSO</a></li> </ul>Thu, 25 Sep 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsR2, R2 Data Catalog - R2 Data Catalog now supports compactionhttps://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/https://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/ <p>You can now enable automatic compaction for <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> tables in <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> to improve query performance.</p> <p>Compaction is the process of taking a group of small files and combining them into fewer larger files. This is an important maintenance operation as it helps ensure that query performance remains consistent by reducing the number of files that needs to be scanned.</p> <p>To enable automatic compaction in R2 Data Catalog, find it under <strong>R2 Data Catalog</strong> in your R2 bucket settings in the dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=799,height=400,format=webp/_astro/compaction.MLojYuHL.png" alt="compaction-dash" loading="lazy" decoding="async" width="799" height="400"> <p>Or with <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> catalog</span><span class="nb-shiki-mdbnqw"> compaction</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">BUCKET_NAM</span><span class="nb-shiki-140thh">E</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --target-size</span><span class="nb-shiki-dzsirb"> 128</span><span class="nb-shiki-dzsirb"> --token</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">API_TOKE</span><span class="nb-shiki-140thh">N</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>To get started with compaction, check out <a href="https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/">manage catalogs</a>. For best practices and limitations, refer to <a href="https://developers.cloudflare.com/r2-data-catalog/table-maintenance/">about compaction</a>.</p>Thu, 25 Sep 2025 00:00:00 GMTR2R2R2 Data CatalogWAF - WAF Release - 2025-09-24 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-09-24-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-24-emergency-waf-release/ <p>This week highlights a critical vendor-specific vulnerability: a deserialization flaw in the License Servlet of Fortra’s GoAnywhere MFT. By forging a license response signature, an attacker can trigger deserialization of arbitrary objects, potentially leading to command injection.</p> <p><strong>Key Findings</strong></p> <ul> <li>GoAnywhere MFT (CVE-2025-10035): Deserialization vulnerability in the License Servlet that allows attackers with a forged license response signature to deserialize arbitrary objects, potentially resulting in command injection.</li> </ul> <p><strong>Impact</strong></p> <p>GoAnywhere MFT (CVE-2025-10035): Exploitation enables attackers to escalate privileges or achieve remote code execution via command injection.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8fe242c7c0d64d689f4fc9a1e08b39f3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e08b39f3</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100787</td><td>Fortra GoAnywhere - Auth Bypass - CVE:CVE-2025-10035</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Wed, 24 Sep 2025 00:00:00 GMTWAFWAFEmail security - Invalid Submissions Feedbackhttps://developers.cloudflare.com/changelog/post/2025-09-23-invalid-submissions/https://developers.cloudflare.com/changelog/post/2025-09-23-invalid-submissions/<p>Email security relies on your submissions to continuously improve our detection models. However, we often receive submissions in formats that cannot be ingested, such as incomplete EMLs, screenshots, or text files.</p> <p>To ensure all customer feedback is actionable, we have launched two new features to manage invalid submissions sent to our team and user <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/phish-submissions/submission-addresses/">submission aliases</a>:</p> <ul> <li><strong>Email Notifications:</strong> We now automatically notify users by email when they provide an invalid submission, educating them on the correct format. To disable notifications, go to <strong><a href="https://one.dash.cloudflare.com/?to=/:account/email-security/settings" target="_blank" rel="noopener">Settings<span class="external-link"> ↗</span></a></strong> &gt; <strong>Invalid submission emails</strong> and turn the feature off.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1096,height=175,format=webp/_astro/EmailSec-Invalid-Submissions-Toggle.DXjbR6aX.png" alt="EmailSec-Invalid-Submissions-Toggle" loading="lazy" decoding="async" width="1096" height="175"> <ul> <li><strong>Invalid Submission dashboard:</strong> You can quickly identify which users need education to provide valid submissions so Cloudflare can provide continuous protection.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1132,height=511,format=webp/_astro/EmailSec-Invalid-Submissions-Dashboard.zuf1on2n.png" alt="EmailSec-Invalid-Submissions-Dashboard" loading="lazy" decoding="async" width="1132" height="511"> <p>Learn more about this feature on <a href="https://developers.cloudflare.com/cloudflare-one/email-security/submissions/invalid-submissions/">invalid submissions</a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Tue, 23 Sep 2025 23:11:49 GMTEmail securityEmail securityWorkers - Improved support for running multiple Workers with `wrangler dev`https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/<p>You can run multiple Workers in a single dev command by passing multiple config files to <code>wrangler dev</code>:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> dev</span><span class="nb-shiki-dzsirb"> --config</span><span class="nb-shiki-mdbnqw"> ./web/wrangler.jsonc</span><span class="nb-shiki-dzsirb"> --config</span><span class="nb-shiki-mdbnqw"> ./api/wrangler.jsonc</span></span></code></pre></figure> <p>Previously, if you ran the command above and then also ran wrangler dev for a different Worker, the Workers running in separate wrangler dev sessions could not communicate with each other. This prevented you from being able to use <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/" target="_blank" rel="noopener">Service Bindings<span class="external-link"> ↗</span></a> and <a href="https://developers.cloudflare.com/workers/observability/logs/tail-workers/" target="_blank" rel="noopener">Tail Workers<span class="external-link"> ↗</span></a> in local development, when running separate wrangler dev sessions.</p> <p>Now, the following works as expected:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Terminal 1: Run your application that includes both Web and API workers</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> dev</span><span class="nb-shiki-dzsirb"> --config</span><span class="nb-shiki-mdbnqw"> ./web/wrangler.jsonc</span><span class="nb-shiki-dzsirb"> --config</span><span class="nb-shiki-mdbnqw"> ./api/wrangler.jsonc</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Terminal 2: Run your auth worker separately</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> dev</span><span class="nb-shiki-dzsirb"> --config</span><span class="nb-shiki-mdbnqw"> ./auth/wrangler.jsonc</span></span></code></pre></figure> <p>These Workers can now communicate with each other across separate dev commands, regardless of your development setup.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">./api/src/index.ts</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // This service binding call now works across dev commands</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> authorized</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AUTH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">isAuthorized</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">authorized) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Unauthorized"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">401</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Hello from API Worker!"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">200</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Check out the <a href="https://developers.cloudflare.com/workers/local-development/multi-workers">Developing with multiple Workers</a> guide to learn more about the different approaches and when to use each one.</p>Tue, 23 Sep 2025 00:00:00 GMTWorkersWorkersAccess - Access Remote Desktop Protocol (RDP) destinations securely from your browser — now generally available!https://developers.cloudflare.com/changelog/post/2025-09-22-browser-based-rdp-ga/https://developers.cloudflare.com/changelog/post/2025-09-22-browser-based-rdp-ga/<p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/">Browser-based RDP</a> with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a> is now generally available for all Cloudflare customers. It enables secure, remote Windows server access without VPNs or RDP clients.</p> <p>Since we announced our <a href="https://developers.cloudflare.com/changelog/access/#2025-06-30">open beta</a>, we've made a few improvements:</p> <ul> <li>Support for targets with IPv6.</li> <li>Support for <a href="https://developers.cloudflare.com/cloudflare-wan/">Magic WAN</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">WARP Connector</a> as on-ramps.</li> <li>More robust error messaging on the login page to help you if you encounter an issue.</li> <li>Worldwide keyboard support. Whether your day-to-day is in Portuguese, Chinese, or something in between, your browser-based RDP experience will look and feel exactly like you are using a desktop RDP client.</li> <li>Cleaned up some other miscellaneous issues, including but not limited to enhanced support for Entra ID accounts and support for usernames with spaces, quotes, and special characters.</li> </ul> <p>As a refresher, here are some benefits browser-based RDP provides:</p> <ul> <li><strong>Control how users authenticate to internal RDP resources</strong> with single sign-on (SSO), multi-factor authentication (MFA), and granular access policies.</li> <li><strong>Record who is accessing which servers and when</strong> to support regulatory compliance requirements and to gain greater visibility in the event of a security event.</li> <li><strong>Eliminate the need to install and manage software on user devices</strong>. You will only need a web browser.</li> <li><strong>Reduce your attack surface</strong> by keeping your RDP servers off the public Internet and protecting them from common threats like credential stuffing or brute-force attacks.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2132,height=1814,format=webp/_astro/browser-based-rdp-access-app.BNXce1JL.png" alt="Example of a browser-based RDP Access application" loading="lazy" decoding="async" width="2132" height="1814"> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/">Connect to RDP in a browser</a>.</p>Mon, 22 Sep 2025 00:00:00 GMTAccessAccessWAF - WAF Release - 2025-09-22https://developers.cloudflare.com/changelog/post/2025-09-22-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-22-waf-release/ <p>This week emphasizes two critical vendor-specific vulnerabilities: a full elevation-of-privilege in Microsoft Azure Networking (CVE-2025-54914) and a server-side template injection (SSTI) leading to remote code execution (RCE) in Skyvern (CVE-2025-49619). These are complemented by enhancements in generic detections (SQLi, SSRF) to improve baseline coverage.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Azure (CVE-2025-54914): Vulnerability in Azure Networking allowing elevation of privileges.</p> </li> <li> <p>Skyvern (CVE-2025-49619): Skyvern ≤ 0.1.85 has a server-side template injection (SSTI) vulnerability in its Prompt field (workflow blocks) via Jinja2. Authenticated users with low privileges can get remote code execution (blind).</p> </li> <li> <p>Generic SQLi / SSRF improvements: Expanded rule coverage to detect obfuscated SQL injection patterns and SSRF across host, local, and cloud contexts.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities allow attackers to escalate privileges or execute code under conditions where previously they could not:</p> <ul> <li> <p>Azure CVE-2025-54914 enables an attacker from the network with no credentials to gain high-level access within Azure Networking; could lead to full compromise of networking components.</p> </li> <li> <p>Skyvern CVE-2025-49619 allows authenticated users with minimal privilege to exploit SSTI for remote code execution, undermining isolation of workflow components.</p> </li> <li> <p>The improvements for SQLi and SSRF reduce risk from common injection and request-based attacks.</p> </li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c36a425ae0c94789a9bc34f06a135cbf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6a135cbf</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100146</td><td>SSRF - Host - 2</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="dfa84b0aed5a4b45b953a36a57035abf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...57035abf</span></button></rule-id></td><td>100146B</td><td>SSRF - Local - 2</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="276073e60c7a4b4d91faba1fbbe18d50"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bbe18d50</span></button></rule-id></td><td>100146C</td><td>SSRF - Cloud - 2</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="78c856218f2d40f4b5988c8c956c1961"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...956c1961</span></button></rule-id></td><td>100714</td><td>Azure - Auth Bypass - CVE:CVE-2025-54914</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9f1c8d4cbf3848dbb940771bc5ced231"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c5ced231</span></button></rule-id></td><td>100758</td><td>Skyvern - Remote Code Execution - CVE:CVE-2025-49619</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6be7e7829f3b43c688e1ac4284a619a1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...84a619a1</span></button></rule-id></td><td>100773</td><td>Next.js - SSRF</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0cc3f50216bf4b448210bcc3983ff2dd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...983ff2dd</span></button></rule-id></td><td>100774</td><td>Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="53bfaeb311a049e3877fa15c0380a1a6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0380a1a6</span></button></rule-id></td><td>100800_BETA</td><td>SQLi - Obfuscated Boolean - Beta</td><td>Log</td><td>Block</td><td>This rule has been merged into the original rule (ID: <rule-id id="7663ea44178441a0b3205c145563445f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5563445f</span></button></rule-id>)</td></tr></tbody></table>Mon, 22 Sep 2025 00:00:00 GMTWAFWAFAI Search - New Metrics View in AutoRAGhttps://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/https://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/<p><a href="https://developers.cloudflare.com/ai-search/">AutoRAG</a> now includes a <strong>Metrics</strong> tab that shows how your data is indexed and searched. Get a clear view of the health of your indexing pipeline, compare usage between <code>ai-search</code> and <code>search</code>, and see which files are retrieved most often.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2062,height=1765,format=webp/_astro/metrics.BBUwKIos.png" alt="Metrics" loading="lazy" decoding="async" width="2062" height="1765"> <p>You can find these metrics within each AutoRAG instance:</p> <ul> <li>Indexing: Track how files are ingested and see status changes over time.</li> <li>Search breakdown: Compare usage between <code>ai-search</code> and <code>search</code> endpoints.</li> <li>Top file retrievals: Identify which files are most frequently retrieved in a given period.</li> </ul> <p>Try it today in <a href="https://developers.cloudflare.com/ai-search/get-started/">AutoRAG</a>.</p>Fri, 19 Sep 2025 00:00:00 GMTAI SearchAI SearchWorkers - Rate Limiting in Workers is now GAhttps://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/https://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/<p><a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/">Rate Limiting within Cloudflare Workers</a> is now Generally Available (GA).</p> <p>The <code>ratelimit</code> binding is now stable and recommended for all production workloads. Existing deployments using the unsafe binding will continue to function to allow for a smooth transition.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/">Workers Rate Limiting</a> documentation.</p>Fri, 19 Sep 2025 00:00:00 GMTWorkersWorkersWorkers - Panic Recovery for Rust Workershttps://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/https://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/ <p>In <a href="https://github.com/cloudflare/workers-rs" target="_blank" rel="noopener">workers-rs<span class="external-link"> ↗</span></a>, Rust panics were previously non-recoverable. A panic would put the Worker into an invalid state, and further function calls could result in memory overflows or exceptions.</p> <p>Now, when a panic occurs, in-flight requests will throw 500 errors, but the Worker will automatically and instantly recover for future requests.</p> <p>This ensures more reliable deployments. Automatic panic recovery is enabled for all new workers-rs deployments as of version 0.6.5, with no configuration required.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="fixing-rust-panics-with-wasm-bindgen">Fixing Rust Panics with Wasm Bindgen</h4><a class="anchor-link" href="#fixing-rust-panics-with-wasm-bindgen"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Rust Workers are built with Wasm Bindgen, which treats panics as non-recoverable. After a panic, the entire Wasm application is considered to be in an invalid state.</p> <p>We now attach a default panic handler in Rust:</p> <figure class="nb-code-figure" data-nb-lang="rust"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="rust" data-nb-lang="rust"><code><span class="line"><span class="nb-shiki-1t8gfj">std</span><span class="nb-shiki-1itgoe">::</span><span class="nb-shiki-1t8gfj">panic</span><span class="nb-shiki-1itgoe">::</span><span class="nb-shiki-1t8gfj">set_hook</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">Box</span><span class="nb-shiki-1itgoe">::</span><span class="nb-shiki-1t8gfj">new</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">move</span><span class="nb-shiki-1itgoe"> |</span><span class="nb-shiki-140thh">panic_info</span><span class="nb-shiki-1itgoe">|</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> hook_impl</span><span class="nb-shiki-140thh">(panic_info);</span></span> <span class="line"><span class="nb-shiki-140thh">}));</span></span></code></pre></figure> <p>Which is registered by default in the JS initialization:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { setPanicHook } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./index.js"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1t8gfj">setPanicHook</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">err</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">error</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Panic handler!"</span><span class="nb-shiki-140thh">, err);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>When a panic occurs, we reset the Wasm state to revert the Wasm application to how it was when the application started.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resetting-vm-state-in-wasm-bindgen">Resetting VM State in Wasm Bindgen</h4><a class="anchor-link" href="#resetting-vm-state-in-wasm-bindgen"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We worked upstream on the Wasm Bindgen project to implement a new <a href="https://github.com/wasm-bindgen/wasm-bindgen/pull/4644" target="_blank" rel="noopener"><code>--experimental-reset-state-function</code> compilation option<span class="external-link"> ↗</span></a> which outputs a new <code>__wbg_reset_state</code> function.</p> <p>This function clears all internal state related to the Wasm VM, and updates all function bindings in place to reference the new WebAssembly instance.</p> <p>One other necessary change here was associating Wasm-created JS objects with an instance identity. If a JS object created by an earlier instance is then passed into a new instance later on, a new "stale object" error is specially thrown when using this feature.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="layered-solution">Layered Solution</h4><a class="anchor-link" href="#layered-solution"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Building on this new Wasm Bindgen feature, layered with our new default panic handler, we also added a proxy wrapper to ensure all top-level exported class instantiations (such as for Rust Durable Objects) are tracked and fully reinitialized when resetting the Wasm instance. This was necessary because the workerd runtime will instantiate exported classes, which would then be associated with the Wasm instance.</p> <p>This approach now provides full panic recovery for Rust Workers on subsequent requests.</p> <p>Of course, we never want panics, but when they do happen they are isolated and can be investigated further from the error logs - avoiding broader service disruption.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="webassembly-exception-handling">WebAssembly Exception Handling</h4><a class="anchor-link" href="#webassembly-exception-handling"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In the future, full support for recoverable panics could be implemented without needing reinitialization at all, utilizing the <a href="https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md" target="_blank" rel="noopener">WebAssembly Exception Handling<span class="external-link"> ↗</span></a> proposal, part of the newly announced <a href="https://webassembly.org/news/2025-09-17-wasm-3.0/" target="_blank" rel="noopener">WebAssembly 3.0<span class="external-link"> ↗</span></a> specification. This would allow unwinding panics as normal JS errors, and concurrent requests would no longer fail.</p> <p><strong>We're making significant improvements to the reliability of <a href="https://github.com/cloudflare/workers-rs" target="_blank" rel="noopener">Rust Workers<span class="external-link"> ↗</span></a>. Join us in <code>#rust-on-workers</code> on the <a href="https://discord.gg/cloudflaredev" target="_blank" rel="noopener">Cloudflare Developers Discord<span class="external-link"> ↗</span></a> to stay updated.</strong></p>Fri, 19 Sep 2025 00:00:00 GMTWorkersWorkersCloudflare Tunnel, Cloudflare Tunnel for SASE - Connect and secure any private or public app by hostname, not IP — with hostname routing for Cloudflare Tunnelhttps://developers.cloudflare.com/changelog/post/2025-09-18-tunnel-hostname-routing/https://developers.cloudflare.com/changelog/post/2025-09-18-tunnel-hostname-routing/ <p>You can now route private traffic to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> based on a hostname or domain, moving beyond the limitations of IP-based routing. This new capability is <strong>free for all Cloudflare One customers</strong>.</p> <p>Previously, Tunnel routes could only be defined by IP address or <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-cidr/">CIDR range</a>. This created a challenge for modern applications with dynamic or ephemeral IP addresses, often forcing administrators to maintain complex and brittle IP lists.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1990,height=530,format=webp/_astro/tunnel-hostname-routing.DSi8MP_7.webp" alt="Hostname-based routing in Cloudflare Tunnel" loading="lazy" decoding="async" width="1990" height="530"> <p><strong>What’s new:</strong></p> <ul> <li><strong>Hostname &amp; Domain Routing</strong>: Create routes for individual hostnames (e.g., <code>payroll.acme.local</code>) or entire domains (e.g., <code>*.acme.local</code>) and direct their traffic to a specific Tunnel.</li> <li><strong>Simplified Zero Trust Policies</strong>: Build resilient policies in Cloudflare Access and Gateway using stable hostnames, making it dramatically easier to apply per-resource authorization for your private applications.</li> <li><strong>Precise Egress Control</strong>: Route traffic for public hostnames (e.g., <code>bank.example.com</code>) through a specific Tunnel to enforce a dedicated source IP, solving the IP allowlist problem for third-party services.</li> <li><strong>No More IP Lists</strong>: This feature makes the workaround of maintaining dynamic IP Lists for Tunnel connections obsolete.</li> </ul> <p>Get started in the Tunnels section of the Zero Trust dashboard with your first <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/">private hostname</a> or <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/">public hostname</a> route.</p> <p>Learn more in our <a href="https://blog.cloudflare.com/tunnel-hostname-routing/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Thu, 18 Sep 2025 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEWorkers - Increased vCPU for Workers Builds on paid planshttps://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/https://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/<p>We recently <a href="https://developers.cloudflare.com/changelog/2025-08-04-builds-increased-disk-size/">increased the available disk space</a> from 8 GB to 20 GB for <strong>all</strong> plans. Building on that improvement, we’re now doubling the CPU power available for paid plans — from 2 vCPU to <strong>4 vCPU</strong>.</p> <p>These changes continue our focus on making <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a> faster and more reliable.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Metric</th> <th>Free Plan</th> <th>Paid Plans</th> </tr> </thead> <tbody> <tr> <td>CPU</td> <td>2 vCPU</td> <td><strong>4 vCPU</strong></td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="performance-improvements">Performance Improvements</h4><a class="anchor-link" href="#performance-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Fast build times</strong>: Even single-threaded workloads benefit from having more vCPUs</li> <li><strong>2x faster multi-threaded builds</strong>: Tools like <a href="https://esbuild.github.io/" target="_blank" rel="noopener">esbuild<span class="external-link"> ↗</span></a> and <a href="https://webpack.js.org/" target="_blank" rel="noopener">webpack<span class="external-link"> ↗</span></a> can now utilize additional cores, delivering near-linear performance scaling</li> </ul> <p>All other <a href="https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/">build limits</a> — including memory, build minutes, and timeout remain unchanged.</p>Thu, 18 Sep 2025 00:00:00 GMTWorkersWorkersWorkers - Preview URLs now default to opt-inhttps://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/https://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/ <p>To prevent the accidental exposure of applications, we've updated how <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">Worker preview URLs</a> (<code>&lt;PREVIEW&gt;-&lt;WORKER_NAME&gt;.&lt;SUBDOMAIN&gt;.workers.dev</code>) are handled. We made this change to ensure preview URLs are only active when intentionally configured, improving the default security posture of your Workers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="one-time-update-for-workers-with-workersdev-disabled">One-Time Update for Workers with workers.dev Disabled</h4><a class="anchor-link" href="#one-time-update-for-workers-with-workersdev-disabled"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We performed a one-time update to disable preview URLs for existing Workers where the <a href="https://developers.cloudflare.com/workers/configuration/routing/workers-dev/">workers.dev subdomain</a> was also disabled.</p> <p>Because preview URLs were historically enabled by default, users who had intentionally disabled their workers.dev route may not have realized their Worker was still accessible at a separate preview URL. This update was performed to ensure that using a preview URL is always an intentional, opt-in choice.</p> <p>If your Worker was affected, its preview URL (<code>&lt;PREVIEW&gt;-&lt;WORKER_NAME&gt;.&lt;SUBDOMAIN&gt;.workers.dev</code>) will now direct to an informational page explaining this change.</p> <p><strong>How to Re-enable Your Preview URL</strong></p> <p>If your preview URL was disabled, you can re-enable it <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#toggle-preview-urls-enable-or-disable">via the Cloudflare dashboard</a> by navigating to your Worker's Settings page and toggling on the Preview URL.</p> <p>Alternatively, you can use Wrangler by adding the <code>preview_urls = true</code> setting to your Wrangler file and redeploying the Worker.</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "preview_urls"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">preview_urls = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p><strong>Note:</strong> You can set <code>preview_urls = true</code> with any Wrangler version that supports the preview URL flag (v3.91.0+). However, we recommend updating to v4.34.0 or newer, as this version defaults <code>preview_urls</code> to false, ensuring preview URLs are always enabled by explicit choice.</p>Wed, 17 Sep 2025 00:00:00 GMTWorkersWorkersCloudflare One - New AI-Enabled Search for Zero Trust Dashboardhttps://developers.cloudflare.com/changelog/post/2025-09-16-new-ai-enabled-search-for-zero-trust-dashboard/https://developers.cloudflare.com/changelog/post/2025-09-16-new-ai-enabled-search-for-zero-trust-dashboard/<p>Zero Trust Dashboard has a brand new, AI-powered search functionality. You can search your account by resources (applications, policies, device profiles, settings, etc.), pages, products, and more.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1750,height=1568,format=webp/_astro/searchexample.Di8yS8ju.png" alt="Example search results in the Zero Trust dashboard" loading="lazy" decoding="async" width="1750" height="1568"> <p><strong>Ask Cloudy</strong> — You can also ask Cloudy, our AI agent, questions about Cloudflare Zero Trust. Cloudy is trained on our developer documentation and implementation guides, so it can tell you how to configure functionality, best practices, and can make recommendations.</p> <p>Cloudy can then stay open with you as you move between pages to build configuration or answer more questions.</p> <p><strong>Find Recents</strong> — Recent searches and Cloudy questions also have a new tab under Zero Trust Overview.</p>Tue, 16 Sep 2025 00:00:00 GMTCloudflare OneCloudflare OneDNS - DNS Firewall Analytics — now in the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-09-16-DNSFW-Analytics-UI/https://developers.cloudflare.com/changelog/post/2025-09-16-DNSFW-Analytics-UI/ <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's New</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Access <a href="https://developers.cloudflare.com/dns/dns-firewall/analytics/">GraphQL-powered DNS Firewall analytics</a> directly in the Cloudflare dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=512,height=284,format=webp/_astro/DNSFW_Analytics_UI.CgjmZFOO.png" alt="DNS Firewall Analytics UI" loading="lazy" decoding="async" width="512" height="284"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="explore-four-interactive-panels">Explore Four Interactive Panels</h4><a class="anchor-link" href="#explore-four-interactive-panels"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Query summary</strong>: Describes trends over time, segmented by dimensions.</li> <li><strong>Query statistics</strong>: Describes totals, cached/uncached queries, and processing/response times.</li> <li><strong>DNS queries by data center</strong>: Describes global view and the top 10 data centers.</li> <li><strong>Top query statistics</strong>: Shows a breakdown by key dimensions, with search and expand options (up to top 100 items).</li> </ul> <p>Additional features:</p> <ul> <li>Apply filters and time ranges once. Changes reflect across all panels.</li> <li>Filter by dimensions like query name, query type, cluster, data center, protocol (UDP/TCP), IP version, response code/reason, and more.</li> <li>Access up to 62 days of historical data with flexible intervals.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Available to all DNS Firewall customers as part of their existing subscription.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="where-to-find-it">Where to Find It</h4><a class="anchor-link" href="#where-to-find-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul><li> <p>In the Cloudflare dashboard, go to the <strong>DNS Firewall</strong> page.</p> <a href="https://dash.cloudflare.com/?to=/:account/dns-firewall/analytics" data-nb-button class="group inline-flex w-max shrink-0 items-center justify-center rounded-full font-medium whitespace-nowrap no-underline shadow-xs transition-colors cursor-pointer select-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary-hover h-9 gap-1.5 px-3 text-sm" target="_blank">Go to <strong>Analytics</strong>&nbsp;&#8599;</a></li> <li> <p>Refer to the <a href="https://developers.cloudflare.com/dns/dns-firewall/analytics/">DNS Firewall Analytics</a> to learn more.</p> </li> </ul>Tue, 16 Sep 2025 00:00:00 GMTDNSDNSWorkers - Remote bindings GA - Connect to remote resources (D1, KV, R2, etc.) during local developmenthttps://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/https://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/ <p>Three months ago <a href="https://developers.cloudflare.com/changelog/2025-06-18-remote-bindings-beta/">we announced the public beta</a> of <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">remote bindings</a> for local development. Now, we're excited to say that it's available for everyone in Wrangler, Vite, and Vitest without using an experimental flag!</p> <p>With remote bindings, you can now connect to deployed resources like <a href="https://developers.cloudflare.com/r2/">R2 buckets</a> and <a href="https://developers.cloudflare.com/d1/">D1 databases</a> while running Worker code on your local machine. This means you can test your local code changes against real data and services, without the overhead of deploying for each iteration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-configuration">Example configuration</h4><a class="anchor-link" href="#example-configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To enable remote bindings, add <code>"remote" : true</code> to each binding that you want to rely on a remote resource running on Cloudflare:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> "r2_buckets"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bucket_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"screenshots-bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"screenshots_bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-worker"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">r2_buckets</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">bucket_name = </span><span class="nb-shiki-mdbnqw">"screenshots-bucket"</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"screenshots_bucket"</span></span> <span class="line"><span class="nb-shiki-140thh">remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>When remote bindings are configured, your Worker <strong>still executes locally</strong>, but all binding calls are proxied to the deployed resource that runs on Cloudflare's network.</p> <p><strong>You can <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">try out remote bindings</a> for local development today with:</strong></p> <ul> <li><a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler v4.37.0</a></li> <li>The <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite Plugin</a></li> <li>The <a href="https://developers.cloudflare.com/workers/testing/vitest-integration/">Cloudflare Vitest Plugin</a></li> </ul>Tue, 16 Sep 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-09-15https://developers.cloudflare.com/changelog/post/2025-09-15-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-15-waf-release/ <p><strong>This week's update</strong></p> <p>This week's focus highlights newly disclosed vulnerabilities in DevOps tooling, data visualization platforms, and enterprise CMS solutions. These issues include sensitive information disclosure and remote code execution, putting organizations at risk of credential leakage, unauthorized access, and full system compromise.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Argo CD (CVE-2025-55190): Exposure of sensitive information could allow attackers to access credential data stored in configurations, potentially leading to compromise of Kubernetes workloads and secrets.</p> </li> <li> <p>DataEase (CVE-2025-57773): Insufficient input validation enables JNDI injection and insecure deserialization, resulting in remote code execution (RCE). Successful exploitation grants attackers control over the application server.</p> </li> <li> <p>Sitecore (CVE-2025-53694): A sensitive information disclosure flaw allows unauthorized access to confidential information stored in Sitecore deployments, raising the risk of data breaches and privilege escalation.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities expose organizations to serious risks, including credential theft, unauthorized access, and full system compromise. Argo CD's flaw may expose Kubernetes secrets, DataEase exploitation could give attackers remote execution capabilities, and Sitecore's disclosure issue increases the likelihood of sensitive data leakage and business impact.</p> <p>Administrators are strongly advised to apply vendor patches immediately, rotate exposed credentials, and review access controls to mitigate these risks.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="199cce9ab21e40bcb535f01b2ee2085f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2ee2085f</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100646</td><td>Argo CD - Information Disclosure - CVE:CVE-2025-55190s</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e513bb21b6a44f9cbfcd2462f5e20788"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f5e20788</span></button></rule-id></td><td>100874</td><td>DataEase - JNDI injection - CVE:CVE-2025-57773</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="be097f5a71a04f27aa87b60d005a12fd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...005a12fd</span></button></rule-id></td><td>100880</td><td>Sitecore - Information Disclosure - CVE:CVE-2025-53694</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 15 Sep 2025 00:00:00 GMTWAFWAFEmail security - Regional Email Processing for Germany, India, or Australiahttps://developers.cloudflare.com/changelog/post/2025-09-11-regional-email-processing-gia/https://developers.cloudflare.com/changelog/post/2025-09-11-regional-email-processing-gia/<p>We’re excited to announce that Email security customers can now choose their preferred mail processing location directly from the UI when onboarding a domain. This feature is available for the following onboarding methods: <strong>MX</strong>, <strong>BCC</strong>, and <strong>Journaling</strong>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What’s new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Customers can now select where their email is processed. The following regions are supported:</p> <ul> <li><strong>Germany</strong></li> <li><strong>India</strong></li> <li><strong>Australia</strong></li> </ul> <p>Global processing remains the default option, providing flexibility to meet both compliance requirements or operational preferences.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-to-use-it">How to use it</h4><a class="anchor-link" href="#how-to-use-it"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When onboarding a domain with MX, BCC, or Journaling:</p> <ol> <li>Select the desired processing location (Germany, India, or Australia).</li> <li>The UI will display updated processing addresses specific to that region.</li> <li>For MX onboarding, if your domain is managed by Cloudflare, you can automatically update MX records directly from the UI.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="availability">Availability</h4><a class="anchor-link" href="#availability"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-next">What’s next</h4><a class="anchor-link" href="#whats-next"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We’re expanding the list of processing locations to match our <a href="https://developers.cloudflare.com/data-localization/">Data Localization Suite (DLS)</a> footprint, giving customers the broadest set of regional options in the market without the complexity of self-hosting.</p>Thu, 11 Sep 2025 23:15:00 GMTEmail securityEmail securityD1, Workers - D1 automatically retries read-only querieshttps://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/https://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/<p>D1 now detects read-only queries and automatically attempts up to two retries to execute those queries in the event of failures with retryable errors. You can access the number of execution attempts in the returned <a href="https://developers.cloudflare.com/d1/worker-api/return-object/#d1result">response metadata</a> property <code>total_attempts</code>.</p> <p>At the moment, only read-only queries are retried, that is, queries containing only the following SQLite keywords: <code>SELECT</code>, <code>EXPLAIN</code>, <code>WITH</code>. Queries containing any <a href="https://sqlite.org/lang_keywords.html" target="_blank" rel="noopener">SQLite keyword<span class="external-link"> ↗</span></a> that leads to database writes are not retried.</p> <p>The retry success ratio among read-only retryable errors varies from 5% all the way up to 95%, depending on the underlying error and its duration (like network errors or other internal errors).</p> <p>The retry success ratio among all retryable errors is lower, indicating that there are write-queries that could be retried. Therefore, we recommend D1 users to continue applying <a href="https://developers.cloudflare.com/d1/best-practices/retry-queries/">retries in their own code</a> for queries that are not read-only but are idempotent according to the business logic of the application.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=946,format=webp/_astro/d1-auto-retry-success-ratio.yPw8B0tB.png" alt="D1 automatically query retries success ratio" loading="lazy" decoding="async" width="1600" height="946"> <p>D1 ensures that any retry attempt does not cause database writes, making the automatic retries safe from side-effects, even if a query causing changes slips through the read-only detection. D1 achieves this by checking for modifications after every query execution, and if any write occurred due to a retry attempt, the query is rolled back.</p> <p>The read-only query detection heuristics are simple for now, and there is room for improvement to capture more cases of queries that can be retried, so this is just the beginning.</p>Thu, 11 Sep 2025 00:00:00 GMTD1D1WorkersGateway, Cloudflare WAN, Cloudflare Tunnel for SASE - DNS filtering for private network onrampshttps://developers.cloudflare.com/changelog/post/2025-09-11-dns-filtering-for-private-network-onramps/https://developers.cloudflare.com/changelog/post/2025-09-11-dns-filtering-for-private-network-onramps/<p><a href="https://developers.cloudflare.com/cloudflare-wan/zero-trust/cloudflare-gateway/#dns-filtering">Magic WAN</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#dns-filtering">WARP Connector</a> users can now securely route their DNS traffic to the Gateway resolver without exposing traffic to the public Internet.</p> <p>Routing DNS traffic to the Gateway resolver allows DNS resolution and filtering for traffic coming from private networks while preserving source internal IP visibility. This ensures Magic WAN users have full integration with our Cloudflare One features, including <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/#internal-dns">Internal DNS</a> and <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/#selector-prerequisites">hostname-based policies</a>.</p> <p>To configure DNS filtering, change your Magic WAN or WARP Connector DNS settings to use Cloudflare's shared resolver IPs, <code>172.64.36.1</code> and <code>172.64.36.2</code>. Once you configure DNS resolution and filtering, you can use <em>Source Internal IP</em> as a traffic selector in your <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/">resolver policies</a> for routing private DNS traffic to your <a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS</a>.</p>Thu, 11 Sep 2025 00:00:00 GMTGatewayGatewayCloudflare WANCloudflare Tunnel for SASELog Explorer - Contextual pivotshttps://developers.cloudflare.com/changelog/post/2025-09-11-contextual-pivots/https://developers.cloudflare.com/changelog/post/2025-09-11-contextual-pivots/<p>Directly from <a href="https://developers.cloudflare.com/log-explorer/log-search/">Log Search</a> results, customers can pivot to other parts of the Cloudflare dashboard to immediately take action as a result of their investigation.</p> <p>From the <code>http_requests</code> or <code>fw_events</code> dataset results, right click on an IP Address or JA3 Fingerprint to pivot to the Investigate portal to lookup the reputation of an IP address or JA3 fingerprint.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1038,height=486,format=webp/_astro/investigate-ip-address.BMVSMzDi.png" alt="Investigate IP address" loading="lazy" decoding="async" width="1038" height="486"> <p>Easily learn about error codes by linking directly to our documentation from the <strong>EdgeResponseStatus</strong> or <strong>OriginResponseStatus</strong> fields.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1186,height=476,format=webp/_astro/view-documentation.Cem5QgeO.png" alt="View documentation" loading="lazy" decoding="async" width="1186" height="476"> <p>From the <code>gateway_http</code> dataset, click on a <strong>policyid</strong> to link directly to the Zero Trust dashboard to review or make changes to a specific Gateway policy.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1274,height=498,format=webp/_astro/policyid.CVjEdahj.png" alt="View policy" loading="lazy" decoding="async" width="1274" height="498">Thu, 11 Sep 2025 00:00:00 GMTLog ExplorerLog ExplorerLog Explorer - New results table viewhttps://developers.cloudflare.com/changelog/post/2025-09-11-new-results-table-view/https://developers.cloudflare.com/changelog/post/2025-09-11-new-results-table-view/<p>The results table view of <strong>Log Search</strong> has been updated with additional functionality and a more streamlined user experience. Users can now easily:</p> <ul> <li>Remove/add columns.</li> <li>Resize columns.</li> <li>Sort columns.</li> <li>Copy values from any field.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1786,height=342,format=webp/_astro/new-table.C2Q8mWJ9.png" alt="New results table view" loading="lazy" decoding="async" width="1786" height="342">Thu, 11 Sep 2025 00:00:00 GMTLog ExplorerLog ExplorerWorkers - Worker version rollback limit increased from 10 to 100https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/<p>The number of recent versions available for a Worker rollback has been increased from 10 to 100.</p> <p>This allows you to:</p> <ul> <li> <p>Promote any of the 100 most recent versions to be the active deployment.</p> </li> <li> <p>Split traffic using <a href="https://developers.cloudflare.com/workers/versions-and-deployments/gradual-deployments/">gradual deployments</a> between your latest code and any of the 100 most recent versions.</p> </li> </ul> <p>You can do this through the Cloudflare dashboard or with <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#rollback">Wrangler's rollback command</a></p> <p>Learn more about <a href="https://developers.cloudflare.com/workers/versions-and-deployments/">versioned deployments</a> and <a href="https://developers.cloudflare.com/workers/versions-and-deployments/rollbacks/">rollbacks</a>.</p>Thu, 11 Sep 2025 00:00:00 GMTWorkersWorkersCloudflare One Client - WARP client for Windows (version 2025.7.106.1)https://developers.cloudflare.com/changelog/post/2025-09-10-warp-windows-beta/https://developers.cloudflare.com/changelog/post/2025-09-10-warp-windows-beta/<p>A new Beta release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and improvements including enhancements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> for even faster resolution. The MASQUE protocol is now the only protocol that can use Proxy mode. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/">WARP mode</a> or all devices matching the profile will lose connectivity.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Enhancements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> for even faster resolution. The MASQUE protocol is now the only protocol that can use Proxy mode. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/">WARP mode</a> or all devices matching the profile will lose connectivity.</li> <li>Improvement to keep TCP connections up the first time WARP connects on devices so that remote desktop sessions (such as RDP or SSH) continue to work.</li> <li>Improvements to maintain Global WARP Override settings when switching between organization configurations.</li> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">MASQUE protocol</a> is now the default protocol for all new WARP device profiles.</li> <li>Improvement to limit idle connections in DoH mode to avoid unnecessary resource usage that can lead to DoH requests not resolving.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about Win32/ClickFix.ABA being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Wed, 10 Sep 2025 14:09:30 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.7.106.1)https://developers.cloudflare.com/changelog/post/2025-09-10-warp-macos-beta/https://developers.cloudflare.com/changelog/post/2025-09-10-warp-macos-beta/<p>A new Beta release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/">beta releases downloads page</a>.</p> <p>This release contains minor fixes and improvements including enhancements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> for even faster resolution. The MASQUE protocol is now the only protocol that can use Proxy mode. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/">WARP mode</a> or all devices matching the profile will lose connectivity.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Enhancements to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode">Proxy mode</a> for even faster resolution. The MASQUE protocol is now the only protocol that can use Proxy mode. If you previously configured a device profile to use Proxy mode with Wireguard, you will need to select a new <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/">WARP mode</a> or all devices matching the profile will lose connectivity.</li> <li>Fixed a bug preventing the <code>warp-diag captive-portal</code> command from running successfully due to the client not parsing SSID on macOS.</li> <li>Improvements to maintain Global WARP Override settings when switching between organization configurations.</li> <li>The <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol">MASQUE protocol</a> is now the default protocol for all new WARP device profiles.</li> <li>Improvement to limit idle connections in DoH mode to avoid unnecessary resource usage that can lead to DoH requests not resolving.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>macOS Sequoia: Due to changes Apple introduced in macOS 15.0.x, the WARP client may not behave as expected. Cloudflare recommends the use of macOS 15.4 or later.</li> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Wed, 10 Sep 2025 14:09:02 GMTCloudflare One ClientCloudflare One ClientAgents, Workers - Agents SDK v0.1.0 and workers-ai-provider v2.0.0 with AI SDK v5 supporthttps://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/https://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/<p>We've shipped a new release for the <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a> bringing full compatibility with <a href="https://ai-sdk.dev/docs/introduction" target="_blank" rel="noopener">AI SDK v5<span class="external-link"> ↗</span></a> and introducing automatic message migration that handles all legacy formats transparently.</p> <p>This release includes improved streaming and tool support, tool confirmation detection (for "human in the loop" systems), enhanced React hooks with automatic tool resolution, improved error handling for streaming responses, and seamless migration utilities that work behind the scenes.</p> <p>This makes it ideal for building production AI chat interfaces with Cloudflare Workers AI models, agent workflows, human-in-the-loop systems, or any application requiring reliable message handling across SDK versions — all while maintaining backward compatibility.</p> <p>Additionally, we've updated workers-ai-provider v2.0.0, the official provider for Cloudflare Workers AI models, to be compatible with AI SDK v5.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="useagentchatoptions">useAgentChat(options)</h4><a class="anchor-link" href="#useagentchatoptions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Creates a new chat interface with enhanced v5 capabilities.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Basic chat setup</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">messages</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sendMessage</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">addToolResult</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent,</span></span> <span class="line"><span class="nb-shiki-140thh"> experimental_automaticToolResolution: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// With custom tool confirmation</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> chat</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> useAgentChat</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> agent,</span></span> <span class="line"><span class="nb-shiki-140thh"> experimental_automaticToolResolution: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> toolsRequiringConfirmation: [</span><span class="nb-shiki-mdbnqw">"dangerousOperation"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="automatic-tool-resolution">Automatic Tool Resolution</h4><a class="anchor-link" href="#automatic-tool-resolution"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Tools are automatically categorized based on their configuration:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Auto-executes (has execute function)</span></span> <span class="line"><span class="nb-shiki-140thh"> getLocalTime: {</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get current local time"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({}),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Date</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">toLocaleString</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Requires confirmation (no execute function)</span></span> <span class="line"><span class="nb-shiki-140thh"> deleteFile: {</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Delete a file from the system"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> filename: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Server-executed (no client confirmation)</span></span> <span class="line"><span class="nb-shiki-140thh"> analyzeData: {</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Analyze dataset on server"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ data: z.</span><span class="nb-shiki-1t8gfj">array</span><span class="nb-shiki-140thh">(z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">()) }),</span></span> <span class="line"><span class="nb-shiki-140thh"> serverExecuted: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> Record</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-dzsirb">string</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">AITool</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="message-handling">Message Handling</h4><a class="anchor-link" href="#message-handling"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Send messages using the new v5 format with parts array:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Text message</span></span> <span class="line"><span class="nb-shiki-1t8gfj">sendMessage</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parts: [{ type: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh">, text: </span><span class="nb-shiki-mdbnqw">"Hello, assistant!"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Multi-part message with file</span></span> <span class="line"><span class="nb-shiki-1t8gfj">sendMessage</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parts: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh">, text: </span><span class="nb-shiki-mdbnqw">"Analyze this image:"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"image"</span><span class="nb-shiki-140thh">, image: imageData },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="tool-confirmation-detection">Tool Confirmation Detection</h4><a class="anchor-link" href="#tool-confirmation-detection"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Simplified logic for detecting pending tool confirmations:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> pendingToolCallConfirmation</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> messages.</span><span class="nb-shiki-1t8gfj">some</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">m</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span></span> <span class="line"><span class="nb-shiki-140thh"> m.parts?.</span><span class="nb-shiki-1t8gfj">some</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">part</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-1t8gfj"> isToolUIPart</span><span class="nb-shiki-140thh">(part) </span><span class="nb-shiki-1itgoe">&amp;&amp;</span><span class="nb-shiki-140thh"> part.state </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "input-available"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ),</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Handle tool confirmation</span></span> <span class="line"><span class="nb-shiki-1itgoe">if</span><span class="nb-shiki-140thh"> (pendingToolCallConfirmation) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> addToolResult</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCallId: part.toolCallId,</span></span> <span class="line"><span class="nb-shiki-140thh"> tool: </span><span class="nb-shiki-1t8gfj">getToolName</span><span class="nb-shiki-140thh">(part),</span></span> <span class="line"><span class="nb-shiki-140thh"> output: </span><span class="nb-shiki-mdbnqw">"User approved the action"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="automatic-message-migration">Automatic Message Migration</h4><a class="anchor-link" href="#automatic-message-migration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Seamlessly handle legacy message formats without code changes.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// All these formats are automatically converted:</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Legacy v4 string content</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> legacyMessage</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content: </span><span class="nb-shiki-mdbnqw">"Hello world"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Legacy v4 with tool calls</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> legacyWithTools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"assistant"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content: </span><span class="nb-shiki-mdbnqw">""</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> toolInvocations: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> toolCallId: </span><span class="nb-shiki-mdbnqw">"123"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> toolName: </span><span class="nb-shiki-mdbnqw">"weather"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> args: { city: </span><span class="nb-shiki-mdbnqw">"SF"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> state: </span><span class="nb-shiki-mdbnqw">"result"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> result: </span><span class="nb-shiki-mdbnqw">"Sunny, 72°F"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Automatically becomes v5 format:</span></span> <span class="line"><span class="nb-shiki-21nrsd">// {</span></span> <span class="line"><span class="nb-shiki-21nrsd">// role: "assistant",</span></span> <span class="line"><span class="nb-shiki-21nrsd">// parts: [{</span></span> <span class="line"><span class="nb-shiki-21nrsd">// type: "tool-call",</span></span> <span class="line"><span class="nb-shiki-21nrsd">// toolCallId: "123",</span></span> <span class="line"><span class="nb-shiki-21nrsd">// toolName: "weather",</span></span> <span class="line"><span class="nb-shiki-21nrsd">// args: { city: "SF" },</span></span> <span class="line"><span class="nb-shiki-21nrsd">// state: "result",</span></span> <span class="line"><span class="nb-shiki-21nrsd">// result: "Sunny, 72°F"</span></span> <span class="line"><span class="nb-shiki-21nrsd">// }]</span></span> <span class="line"><span class="nb-shiki-21nrsd">// }</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="tool-definition-updates">Tool Definition Updates</h4><a class="anchor-link" href="#tool-definition-updates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Migrate tool definitions to use the new <code>inputSchema</code> property.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Before (AI SDK v4)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> weather: {</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get weather information"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parameters: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> city: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">args</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> getWeather</span><span class="nb-shiki-140thh">(args.city);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// After (AI SDK v5)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> tools</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> weather: {</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Get weather information"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> city: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">args</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> getWeather</span><span class="nb-shiki-140thh">(args.city);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflare-workers-ai-integration">Cloudflare Workers AI Integration</h4><a class="anchor-link" href="#cloudflare-workers-ai-integration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v2.0.0.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="model-setup-with-workers-ai">Model Setup with Workers AI</h4><a class="anchor-link" href="#model-setup-with-workers-ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Use Cloudflare Workers AI models directly in your agent workflows:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createWorkersAI } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "workers-ai-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { useAgentChat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/ai-react"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Create Workers AI model (v2.0.0 - same API, enhanced v5 internals)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> model</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createWorkersAI</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> binding: env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">})(</span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-3.2-3b-instruct"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enhanced-file-and-image-support">Enhanced File and Image Support</h4><a class="anchor-link" href="#enhanced-file-and-image-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Workers AI models now support v5 file handling with automatic conversion:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Send images and files to Workers AI models</span></span> <span class="line"><span class="nb-shiki-1t8gfj">sendMessage</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> parts: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh">, text: </span><span class="nb-shiki-mdbnqw">"Analyze this image:"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"file"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> data: imageBuffer,</span></span> <span class="line"><span class="nb-shiki-140thh"> mediaType: </span><span class="nb-shiki-mdbnqw">"image/jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Workers AI provider automatically converts to proper format</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="streaming-with-workers-ai">Streaming with Workers AI</h4><a class="anchor-link" href="#streaming-with-workers-ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Enhanced streaming support with automatic warning detection:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Streaming with Workers AI models</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> streamText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-1t8gfj">createWorkersAI</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh"> })(</span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-3.2-3b-instruct"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onChunk</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">chunk</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Enhanced streaming with warning handling</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(chunk);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="import-updates">Import Updates</h4><a class="anchor-link" href="#import-updates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Update your imports to use the new v5 types:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Before (AI SDK v4)</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { Message } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { useChat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai/react"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// After (AI SDK v5)</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { UIMessage } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-21nrsd">// or alias for compatibility</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { UIMessage </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-140thh"> Message } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { useChat } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@ai-sdk/react"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resources">Resources</h4><a class="anchor-link" href="#resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v5.md" target="_blank" rel="noopener">Migration Guide<span class="external-link"> ↗</span></a> - Comprehensive migration documentation</li> <li><a href="https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0" target="_blank" rel="noopener">AI SDK v5 Documentation<span class="external-link"> ↗</span></a> - Official AI SDK migration guide</li> <li><a href="https://github.com/cloudflare/agents-starter/pull/105" target="_blank" rel="noopener">An Example PR showing the migration from AI SDK v4 to v5<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/agents/issues" target="_blank" rel="noopener">GitHub Issues<span class="external-link"> ↗</span></a> - Report bugs or request features</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="feedback-welcome">Feedback Welcome</h4><a class="anchor-link" href="#feedback-welcome"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We'd love your feedback! We're particularly interested in feedback on:</p> <ul> <li><strong>Migration experience</strong> - How smooth was the upgrade process?</li> <li><strong>Tool confirmation workflow</strong> - Does the new automatic detection work as expected?</li> <li><strong>Message format handling</strong> - Any edge cases with legacy message conversion?</li> </ul>Wed, 10 Sep 2025 00:00:00 GMTAgentsAgentsWorkersWorkers - Built with Cloudflare buttonhttps://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/https://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/<p>We've updated our "Built with Cloudflare" button to make it easier to share that you're building on Cloudflare with the world. Embed it in your project's README, blog post, or wherever you want to let people know.</p> <img src="https://workers.cloudflare.com/built-with-cloudflare.svg" alt="Built with Cloudflare"> <p>Check out the <a href="https://developers.cloudflare.com/workers/platform/built-with-cloudflare">documentation</a> for usage information.</p>Wed, 10 Sep 2025 00:00:00 GMTWorkersWorkersWorkers - Deploy static sites to Workers without a configuration filehttps://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/https://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/<p>Deploying static site to Workers is now easier. When you run <code>wrangler deploy [directory]</code> or <code>wrangler deploy --assets [directory]</code> without an existing <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">configuration file</a>, <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler CLI</a> now guides you through the deployment process with interactive prompts.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-and-after">Before and after</h4><a class="anchor-link" href="#before-and-after"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Before:</strong> Required remembering multiple flags and parameters</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-dzsirb"> --assets</span><span class="nb-shiki-mdbnqw"> ./dist</span><span class="nb-shiki-dzsirb"> --compatibility-date</span><span class="nb-shiki-mdbnqw"> 2025-09-09</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> my-project</span></span></code></pre></figure> <p><strong>After:</strong> Simple directory deployment with guided setup</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-mdbnqw"> dist</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Interactive prompts handle the rest as shown in the example flow below</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new">What's new</h4><a class="anchor-link" href="#whats-new"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Interactive prompts for missing configuration:</strong></p> <ul> <li>Wrangler detects when you're trying to deploy a directory of static assets</li> <li>Prompts you to confirm the deployment type</li> <li>Asks for a project name (with smart defaults)</li> <li>Automatically sets the compatibility date to today</li> </ul> <p><strong>Automatic configuration generation:</strong></p> <ul> <li>Creates a <code>wrangler.jsonc</code> file with your deployment settings</li> <li>Stores your choices for future deployments</li> <li>Eliminates the need to remember complex command-line flags</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-workflow">Example workflow</h4><a class="anchor-link" href="#example-workflow"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Deploy your built static site</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-mdbnqw"> dist</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Wrangler will prompt:</span></span> <span class="line"><span class="nb-shiki-1t8gfj">✔</span><span class="nb-shiki-mdbnqw"> It</span><span class="nb-shiki-mdbnqw"> looks</span><span class="nb-shiki-mdbnqw"> like</span><span class="nb-shiki-mdbnqw"> you</span><span class="nb-shiki-mdbnqw"> are</span><span class="nb-shiki-mdbnqw"> trying</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> deploy</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> directory</span><span class="nb-shiki-mdbnqw"> of</span><span class="nb-shiki-mdbnqw"> static</span><span class="nb-shiki-mdbnqw"> assets</span><span class="nb-shiki-mdbnqw"> only.</span><span class="nb-shiki-mdbnqw"> Is</span><span class="nb-shiki-mdbnqw"> this</span><span class="nb-shiki-mdbnqw"> correct?</span><span class="nb-shiki-mdbnqw"> …</span><span class="nb-shiki-mdbnqw"> yes</span></span> <span class="line"><span class="nb-shiki-1t8gfj">✔</span><span class="nb-shiki-mdbnqw"> What</span><span class="nb-shiki-mdbnqw"> do</span><span class="nb-shiki-mdbnqw"> you</span><span class="nb-shiki-mdbnqw"> want</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> name</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> project?</span><span class="nb-shiki-mdbnqw"> …</span><span class="nb-shiki-mdbnqw"> my-astro-site</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Automatically generates a wrangler.jsonc file and adds it to your project:</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "name"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "my-astro-site",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "compatibility_date"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "2025-09-09",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "assets"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "directory"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "dist"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Next time you run wrangler deploy, this will use the configuration in your newly generated wrangler.jsonc file</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> deploy</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="requirements">Requirements</h4><a class="anchor-link" href="#requirements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>You must use Wrangler version 4.24.4 or later in order to use this feature</li> </ul>Tue, 09 Sep 2025 00:00:00 GMTWorkersWorkersCloudflare WAN - Custom IKE ID for IPsec Tunnelshttps://developers.cloudflare.com/changelog/post/2025-09-08-custom-ike-id-ipsec-tunnels/https://developers.cloudflare.com/changelog/post/2025-09-08-custom-ike-id-ipsec-tunnels/<p>Now, Magic WAN customers can configure a custom IKE ID for their IPsec tunnels. Customers that are using Magic WAN and a VeloCloud SD-WAN device together can utilize this new feature to create a high availability configuration.</p> <p>This feature is available via API only. Customers can read the Magic WAN documentation to learn more about the <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/common-settings/custom-ike-id-ipsec/">Custom IKE ID feature and the API call to configure it</a>.</p>Mon, 08 Sep 2025 00:00:00 GMTCloudflare WANCloudflare WANCloudflare Fundamentals - Reminders about two-factor authentication backup codeshttps://developers.cloudflare.com/changelog/post/2025-09-08-reminders-about-two-factor-authentication-backup-codes/https://developers.cloudflare.com/changelog/post/2025-09-08-reminders-about-two-factor-authentication-backup-codes/<p>Two-factor authentication is the best way to help protect your account from account takeovers, but if you lose your second factor, you could be locked out of your account. Lock outs are one of the top reasons customers contact Cloudflare support, and our policies often don't allow us to bypass two-factor authentication for customers that are locked out. Today we are releasing an improvement where Cloudflare will periodically remind you to securely save your backup codes so you don't get locked out in the future.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/user-profiles/2fa/">Two-factor authentication</a></li> </ul>Mon, 08 Sep 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2025-09-08https://developers.cloudflare.com/changelog/post/2025-09-08-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-08-waf-release/ <p><strong>This week's update</strong></p> <p>This week’s focus highlights newly disclosed vulnerabilities in web frameworks, enterprise applications, and widely deployed CMS plugins. The vulnerabilities include SSRF, authentication bypass, arbitrary file upload, and remote code execution (RCE), exposing organizations to high-impact risks such as unauthorized access, system compromise, and potential data exposure. In addition, security rule enhancements have been deployed to cover general command injection and server-side injection attacks, further strengthening protections.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Next.js (CVE-2025-57822): Improper handling of redirects in custom middleware can lead to server-side request forgery (SSRF) when user-supplied headers are forwarded. Attackers could exploit this to access internal services or cloud metadata endpoints. The issue has been resolved in versions 14.2.32 and 15.4.7. Developers using custom middleware should upgrade and verify proper redirect handling in <code>next()</code> calls.</p> </li> <li> <p>ScriptCase (CVE-2025-47227, CVE-2025-47228): In the Production Environment extension in Netmake ScriptCase through 9.12.006 (23), two vulnerabilities allow attackers to reset admin accounts and execute system commands, potentially leading to full compromise of affected deployments.</p> </li> <li> <p>Sar2HTML (CVE-2025-34030): In Sar2HTML version 3.2.2 and earlier, insufficient input sanitization of the plot parameter allows remote, unauthenticated attackers to execute arbitrary system commands. Exploitation could compromise the underlying server and its data.</p> </li> <li> <p>Zhiyuan OA (CVE-2025-34040): An arbitrary file upload vulnerability exists in the Zhiyuan OA platform. Improper validation in the <code>wpsAssistServlet</code> interface allows unauthenticated attackers to upload crafted files via path traversal, which can be executed on the web server, leading to remote code execution.</p> </li> <li> <p>WordPress:Plugin:InfiniteWP Client (CVE-2020-8772): A vulnerability in the InfiniteWP Client plugin allows attackers to perform restricted actions and gain administrative control of connected WordPress sites.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities could allow attackers to gain unauthorized access, execute malicious code, or take full control of affected systems. The Next.js SSRF flaw may expose internal services or cloud metadata endpoints to attackers. Exploitations of ScriptCase and Sar2HTML could result in remote code execution, administrative takeover, and full server compromise. In Zhiyuan OA, the arbitrary file upload vulnerability allows attackers to execute malicious code on the web server, potentially exposing sensitive data and applications. The authentication bypass in WordPress InfiniteWP Client enables attackers to gain administrative access, risking data exposure and unauthorized control of connected sites.</p> <p>Administrators are strongly advised to apply vendor patches immediately, remove unsupported software, and review authentication and access controls to mitigate these risks.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7c5812a31fd94996b3299f7e963d7afc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...963d7afc</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100007D</td><td>Command Injection - Common Attack Commands Args</td><td>Log</td><td>Block</td><td>This rule has been merged into the original rule "Command Injection - Common Attack Commands" (ID: <rule-id id="89557ce9b26e4d4dbf29e90c28345b9b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...28345b9b</span></button></rule-id>) for New WAF customers only.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cd528243d6824f7ab56182988230a75b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8230a75b</span></button></rule-id></td><td>100617</td><td>Next.js - SSRF - CVE:CVE-2025-57822</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="503b337dac5c409d8f833a6ba22dabf1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a22dabf1</span></button></rule-id></td><td>100659_BETA</td><td>Common Payloads for Server-Side Template Injection - Beta</td><td>Log</td><td>Block</td><td>This rule is merged into the original rule "Common Payloads for Server-Side Template Injection" (ID: <rule-id id="21c7a963e1b749e7b1753238a28a42c4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a28a42c4</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6d24266148f24f5e9fa487f8b416b7ca"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b416b7ca</span></button></rule-id></td><td>100824B</td><td>CrushFTP - Remote Code Execution - CVE:CVE-2025-54309 - 3</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="154b217c43d04f11a13aeff05db1fa6b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5db1fa6b</span></button></rule-id></td><td>100848</td><td>ScriptCase - Auth Bypass - CVE:CVE-2025-47227</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cad6f1c8c6d44ef59929e6532c62d330"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2c62d330</span></button></rule-id></td><td>100849</td><td>ScriptCase - Command Injection - CVE:CVE-2025-47228</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e7464139fd3e44938b56716bef971afd"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ef971afd</span></button></rule-id></td><td>100872</td><td>WordPress:Plugin:InfiniteWP Client - Missing Authorization - CVE:CVE-2020-8772</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0181ebb2cc234f2d863412e1bab19b0b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bab19b0b</span></button></rule-id></td><td>100873</td><td>Sar2HTML - Command Injection - CVE:CVE-2025-34030</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="34d5c7c7b08b40eaad5b2bb3f24c0fbe"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f24c0fbe</span></button></rule-id></td><td>100875</td><td>Zhiyuan OA - Remote Code Execution - CVE:CVE-2025-34040</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 08 Sep 2025 00:00:00 GMTWAFWAFCloudflare WAN - Bidirectional tunnel health checks are compatible with all Magic on-rampshttps://developers.cloudflare.com/changelog/post/2025-09-05-bidirectional-health-check-any-on-ramp/https://developers.cloudflare.com/changelog/post/2025-09-05-bidirectional-health-check-any-on-ramp/<p>All bidirectional tunnel health check return packets are accepted by any Magic on-ramp.</p> <p>Previously, when a Magic tunnel had a bidirectional health check configured, the bidirectional health check would pass when the return packets came back to Cloudflare over the same tunnel that was traversed by the forward packets.</p> <p>There are SD-WAN devices, like VeloCloud, that do not offer controls to steer traffic over one tunnel versus another in a high availability tunnel configuration.</p> <p>Now, when a Magic tunnel has a bidirectional health check configured, the bidirectional health check will pass when the return packet traverses over any tunnel in a high availability configuration.</p>Fri, 05 Sep 2025 00:00:00 GMTCloudflare WANCloudflare WANWorkers AI - Introducing EmbeddingGemma from Google on Workers AIhttps://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/https://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/<p>We're excited to be a launch partner alongside <a href="https://developers.googleblog.com/en/introducing-embeddinggemma/" target="_blank" rel="noopener">Google<span class="external-link"> ↗</span></a> to bring their newest embedding model, <strong>EmbeddingGemma</strong>, to Workers AI that delivers best-in-class performance for its size, enabling RAG and semantic search use cases.</p> <p><a href="https://developers.cloudflare.com/workers-ai/models/embeddinggemma-300m/"><code>@cf/google/embeddinggemma-300m</code></a> is a 300M parameter embedding model from Google, built from Gemma 3 and the same research used to create Gemini models. This multilingual model supports 100+ languages, making it ideal for RAG systems, semantic search, content classification, and clustering tasks.</p> <p><strong>Using EmbeddingGemma in AI Search:</strong> Now you can leverage EmbeddingGemma directly through AI Search for your RAG pipelines. EmbeddingGemma's multilingual capabilities make it perfect for global applications that need to understand and retrieve content across different languages with exceptional accuracy.</p> <p>To use EmbeddingGemma for your AI Search projects:</p> <ol> <li>Go to <strong>Create</strong> in the <a href="https://dash.cloudflare.com/?to=/:account/ai/ai-search" target="_blank" rel="noopener">AI Search dashboard<span class="external-link"> ↗</span></a></li> <li>Follow the setup flow for your new RAG instance</li> <li>In the <strong>Generate Index</strong> step, open up <strong>More embedding models</strong> and select <code>@cf/google/embeddinggemma-300m</code> as your embedding model</li> <li>Complete the setup to create an AI Search</li> </ol> <p>Try it out and let us know what you think!</p>Fri, 05 Sep 2025 00:00:00 GMTWorkers AIWorkers AIWAF - WAF Release - 2025-09-04 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-09-04-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-04-emergency-waf-release/ <p><strong>This week's update</strong></p> <p>This week, new critical vulnerabilities were disclosed in Sitecore’s Sitecore Experience Manager (XM), Sitecore Experience Platform (XP), specifically versions 9.0 through 9.3, and 10.0 through 10.4. These flaws are caused by unsafe data deserialization and code reflection, leaving affected systems at high risk of exploitation.</p> <p><strong>Key Findings</strong></p> <ul> <li>CVE-2025-53690: Remote Code Execution through Insecure Deserialization</li> <li>CVE-2025-53691: Remote Code Execution through Insecure Deserialization</li> <li>CVE-2025-53693: HTML Cache Poisoning through Unsafe Reflections</li> </ul> <p><strong>Impact</strong></p> <p>Exploitation could allow attackers to execute arbitrary code remotely on the affected system and conduct cache poisoning attacks, potentially leading to further compromise. Applying the latest vendor-released solution without delay is strongly recommended.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="588edc74df1f4609b3c2f7ef0ee2c15e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0ee2c15e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100878</td><td>Sitecore - Remote Code Execution - CVE:CVE-2025-53691</td><td>N/A</td><td>Block</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d1bd7563e6254db48ce703807c5b669c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7c5b669c</span></button></rule-id></td><td>100631</td><td>Sitecore - Cache Poisoning - CVE:CVE-2025-53693</td><td>N/A</td><td>Block</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ed94c7ce5301411a94a21a096c410240"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6c410240</span></button></rule-id></td><td>100879</td><td>Sitecore - Remote Code Execution - CVE:CVE-2025-53690</td><td>N/A</td><td>Block</td><td>This is a new detection</td></tr></tbody></table>Thu, 04 Sep 2025 00:00:00 GMTWAFWAFWorkers, Workers for Platforms - Increased static asset limits for Workershttps://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/https://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/<p>You can now upload up to <strong>100,000 static assets</strong> per Worker version</p> <ul> <li>Paid and Workers for Platforms users can now upload up to <strong>100,000 static assets</strong> per Worker version, a 5x increase from the previous limit of 20,000.</li> <li>Customers on the free plan still have the same limit as before — 20,000 static assets per version of your Worker</li> <li>The individual file size limit of 25 MiB remains unchanged for all customers.</li> </ul> <p>This increase allows you to build larger applications with more static assets without hitting limits.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="wrangler">Wrangler</h4><a class="anchor-link" href="#wrangler"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To take advantage of the increased limits, you must use <strong>Wrangler version 4.34.0 or higher</strong>. Earlier versions of Wrangler will continue to enforce the previous 20,000 file limit.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For more information about Workers static assets, see the <a href="https://developers.cloudflare.com/workers/static-assets/">Static Assets documentation</a> and <a href="https://developers.cloudflare.com/workers/platform/limits/#static-assets">Platform Limits</a>.</p>Thu, 04 Sep 2025 00:00:00 GMTWorkersWorkersWorkers for PlatformsWorkers - A new, simpler REST API for Cloudflare Workers (Beta)https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/<p>You can now manage <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/methods/create/"><strong>Workers</strong></a>, <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/models/worker/#(schema)"><strong>Versions</strong></a>, and <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/content/methods/update/"><strong>Deployments</strong></a> as separate resources with a new, resource-oriented API (Beta).</p> <p>This new API is supported in the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Cloudflare Terraform provider<span class="external-link"> ↗</span></a> and the <a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener">Cloudflare Typescript SDK<span class="external-link"> ↗</span></a>, allowing platform teams to manage a Worker's infrastructure in Terraform, while development teams handle code deployments from a separate repository or workflow. We also designed this API with AI agents in mind, as a clear, predictable structure is essential for them to reliably build, test, and deploy applications.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="try-it-out">Try it out</h4><a class="anchor-link" href="#try-it-out"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/"><strong>New beta API endpoints</strong></a></li> <li><a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener"><strong>Cloudflare TypeScript SDK v5.0.0</strong><span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/cloudflare-go" target="_blank" rel="noopener"><strong>Cloudflare Go SDK v6.0.0</strong><span class="external-link"> ↗</span></a></li> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener"><strong>Terraform provider v5.9.0</strong><span class="external-link"> ↗</span></a>: <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker" target="_blank" rel="noopener"><code>cloudflare_worker</code><span class="external-link"> ↗</span></a> , <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version" target="_blank" rel="noopener"><code>cloudflare_worker_version</code><span class="external-link"> ↗</span></a>, and <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_deployment" target="_blank" rel="noopener"><code>cloudflare_workers_deployments</code><span class="external-link"> ↗</span></a> resources.</li> <li>See full examples in our <a href="https://developers.cloudflare.com/workers/platform/infrastructure-as-code">Infrastructure as Code (IaC) guide</a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="before-eight-endpoints-with-mixed-responsibilities">Before: Eight+ endpoints with mixed responsibilities</h4><a class="anchor-link" href="#before-eight-endpoints-with-mixed-responsibilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=7360,height=6176,format=webp/_astro/api-before.VkE1i-Rj.png" alt="Before" loading="lazy" decoding="async" width="7360" height="6176"> <p>The existing API was originally designed for simple, one-shot script uploads:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> PUT</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/workers/scripts/</span><span class="nb-shiki-140thh">$SCRIPT_NAME</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "X-Auth-Email: </span><span class="nb-shiki-140thh">$CLOUDFLARE_EMAIL</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "X-Auth-Key: </span><span class="nb-shiki-140thh">$CLOUDFLARE_API_KEY</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Content-Type: multipart/form-data"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'metadata={</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "main_module": "worker.js",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "compatibility_date": "$today$"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> "worker.js=@worker.js;type=application/javascript+module"</span></span></code></pre></figure> <p>This API worked for creating a basic Worker, uploading all of its code, and deploying it immediately — but came with challenges:</p> <ul> <li> <p><strong>A Worker couldn't exist without code</strong>: To create a Worker, you had to upload its code in the same API request. This meant platform teams couldn't provision Workers with the proper settings, and then hand them off to development teams to deploy the actual code.</p> </li> <li> <p><strong>Several endpoints implicitly created deployments</strong>: Simple updates like adding a secret or changing a script's content would implicitly create a new version and immediately deploy it.</p> </li> <li> <p><strong>Updating a setting was confusing</strong>: Configuration was scattered across eight endpoints with overlapping responsibilities. This ambiguity made it difficult for human developers (and even more so for AI agents) to reliably update a Worker via API.</p> </li> <li> <p><strong>Scripts used names as primary identifiers</strong>: This meant simple renames could turn into a risky migration, requiring you to create a brand new Worker and update every reference. If you were using Terraform, this could inadvertently destroy your Worker altogether.</p> </li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="after-three-resources-with-clear-boundaries">After: Three resources with clear boundaries</h4><a class="anchor-link" href="#after-three-resources-with-clear-boundaries"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=7360,height=4680,format=webp/_astro/api-after.J8u2vIcT.png" alt="After" loading="lazy" decoding="async" width="7360" height="4680"> The new API introduces cleaner resource management with three core resources: <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/methods/create/"><strong>Worker</strong></a>, <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/models/worker/#(schema)"><strong>Versions</strong></a>, and <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/content/methods/update/"><strong>Deployment</strong></a>.</p> <p>All endpoints now use simple JSON payloads, with script content embedded as <code>base64</code>-encoded strings -- a more consistent and reliable approach than the previous <code>multipart/form-data</code> format.</p> <ul> <li> <p><strong>Worker</strong>: The parent resource representing your application. It has a stable UUID and holds persistent settings like <code>name</code>, <code>tags</code>, and <code>logpush</code>. You can now create a Worker to establish its identity and settings <strong>before</strong> any code is uploaded.</p> </li> <li> <p><strong>Version</strong>: An immutable snapshot of your code and its specific configuration, like bindings and <code>compatibility_date</code>. Creating a new version is a safe action that doesn't affect live traffic.</p> </li> <li> <p><strong>Deployment</strong>: An explicit action that directs traffic to a specific version.</p> </li> </ul> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p><a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/">Workers</a> and <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/subresources/versions/">Versions</a> use the new <code>/workers/</code> beta endpoints, while <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/deployments/">Deployments</a> remain on the existing <code>/scripts/</code> endpoint. Pair the new endpoints with the existing Deployment API for a complete workflow.</p></div></div></aside> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-this-matters">Why this matters</h4><a class="anchor-link" href="#why-this-matters"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="you-can-now-create-workers-before-uploading-code">You can now create Workers before uploading code</h4><a class="anchor-link" href="#you-can-now-create-workers-before-uploading-code"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Workers are now standalone resources that can be created and configured without any code. Platform teams can provision Workers with the right settings, then hand them off to development teams for implementation.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-typescript-sdk">Example: Typescript SDK</h4><a class="anchor-link" href="#example-typescript-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Step 1: Platform team creates the Worker resource (no code needed)</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> worker</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.workers.beta.workers.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"payment-service"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> observability: {</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Step 2: Development team adds code and creates a version later</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> version</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.workers.beta.workers.versions.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">(worker.id, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module: </span><span class="nb-shiki-mdbnqw">"worker.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> compatibility_date: </span><span class="nb-shiki-mdbnqw">"$today"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> bindings: [ </span><span class="nb-shiki-21nrsd">/*...*/</span><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> modules: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"worker.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content_type: </span><span class="nb-shiki-mdbnqw">"application/javascript+module"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content_base64: Buffer.</span><span class="nb-shiki-1t8gfj">from</span><span class="nb-shiki-140thh">(scriptContent).</span><span class="nb-shiki-1t8gfj">toString</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"base64"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Step 3: Deploy explicitly when ready</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> deployment</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.workers.scripts.deployments.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">(worker.name, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: </span><span class="nb-shiki-mdbnqw">"..."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> strategy: </span><span class="nb-shiki-mdbnqw">"percentage"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> versions: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> percentage: </span><span class="nb-shiki-dzsirb">100</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> version_id: version.id,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-terraform">Example: Terraform</h4><a class="anchor-link" href="#example-terraform"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you use Terraform, you can now declare the Worker in your Terraform configuration and manage configuration outside of Terraform in your Worker's <a href="https://developers.cloudflare.com/workers/wrangler/configuration/"><code>wrangler.jsonc</code> file</a> and deploy code changes using <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>.</p> <figure class="nb-code-figure" data-nb-lang="tf"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tf" data-nb-lang="tf"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_worker"</span><span class="nb-shiki-dzsirb"> "my_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "..."</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my-important-service"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Manage Versions and Deployments here or outside of Terraform</span></span> <span class="line"><span class="nb-shiki-21nrsd"># resource "cloudflare_worker_version" "my_worker_version" {}</span></span> <span class="line"><span class="nb-shiki-21nrsd"># resource "cloudflare_workers_deployment" "my_worker_deployment" {}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="deployments-are-always-explicit-never-implicit">Deployments are always explicit, never implicit</h4><a class="anchor-link" href="#deployments-are-always-explicit-never-implicit"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Creating a version and deploying it are now always explicit, separate actions - never implicit side effects. To update version-specific settings (like bindings), you create a new version with those changes. The existing deployed version remains unchanged until you explicitly deploy the new one.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Step 1: Create a new version with updated settings (doesn't affect live traffic)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">POST</span><span class="nb-shiki-mdbnqw"> /workers/workers/{id}/versions</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "compatibility_date"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "</span><span class="nb-shiki-140thh">$today</span><span class="nb-shiki-mdbnqw">",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "bindings"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "name"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "MY_NEW_ENV_VAR",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "text"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "new_value",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "type"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "plain_text"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "modules"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [...]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Step 2: Explicitly deploy when ready (now affects live traffic)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">POST</span><span class="nb-shiki-mdbnqw"> /workers/scripts/{script_name}/deployments</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "strategy"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "percentage",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "versions"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "percentage"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> 100,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "version_id"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "new_version_id"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="settings-are-clearly-organized-by-scope">Settings are clearly organized by scope</h4><a class="anchor-link" href="#settings-are-clearly-organized-by-scope"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Configuration is now logically divided: <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/"><strong>Worker settings</strong></a> (like <code>name</code> and <code>tags</code>) persist across all versions, while <a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/subresources/versions/"><strong>Version settings</strong></a> (like <code>bindings</code> and <code>compatibility_date</code>) are specific to each code snapshot.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Worker settings (the parent resource)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">PUT</span><span class="nb-shiki-mdbnqw"> /workers/workers/{id}</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "name"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "payment-service",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "tags"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-mdbnqw">"production"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "logpush"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-dzsirb"> true</span><span class="nb-shiki-mdbnqw">,</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Version settings (the "code")</span></span> <span class="line"><span class="nb-shiki-1t8gfj">POST</span><span class="nb-shiki-mdbnqw"> /workers/workers/{id}/versions</span></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "compatibility_date"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "</span><span class="nb-shiki-140thh">$today</span><span class="nb-shiki-mdbnqw">",</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "bindings"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [...],</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> "modules"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-140thh"> [...]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-api-endpoints-now-support-uuids-in-addition-to-names"><code>/workers</code> API endpoints now support UUIDs (in addition to names)</h4><a class="anchor-link" href="#workers-api-endpoints-now-support-uuids-in-addition-to-names"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>/workers/workers/</code> path now supports addressing a Worker by both its immutable UUID and its mutable name.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Both work for the same Worker</span></span> <span class="line"><span class="nb-shiki-1t8gfj">GET</span><span class="nb-shiki-mdbnqw"> /workers/workers/29494978e03748669e8effb243cf2515</span><span class="nb-shiki-21nrsd"> # UUID (stable for automation)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">GET</span><span class="nb-shiki-mdbnqw"> /workers/workers/payment-service</span><span class="nb-shiki-21nrsd"> # Name (convenient for humans)</span></span></code></pre></figure> <p>This dual approach means:</p> <ul> <li>Developers can use readable names for debugging.</li> <li>Automation can rely on stable UUIDs to prevent errors when Workers are renamed.</li> <li>Terraform can rename Workers without destroying and recreating them.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/workers/platform/infrastructure-as-code">Infrastructure as Code (IaC) guide</a></li> <li><a href="https://developers.cloudflare.com/api/resources/workers/subresources/beta/">API documentation</a></li> <li><a href="https://developers.cloudflare.com/workers/versions-and-deployments/">Versions and Deployments overview</a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="technical-notes">Technical notes</h4><a class="anchor-link" href="#technical-notes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>The pre-existing Workers REST API remains fully supported. Once the new API exits beta, we'll provide a migration timeline with ample notice and comprehensive migration guides.</li> <li>Existing Terraform resources and SDK methods will continue to be fully supported through the current major version.</li> <li>While the Deployments API currently remains on the <code>/scripts/</code> endpoint, we plan to introduce a new Deployments endpoint under <code>/workers/</code> to match the new API structure.</li> </ul>Thu, 04 Sep 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals - Introducing new headers for rate limiting on Cloudflare's APIhttps://developers.cloudflare.com/changelog/post/2025-09-03-rate-limiting-improvement/https://developers.cloudflare.com/changelog/post/2025-09-03-rate-limiting-improvement/<p>Cloudflare's API now supports rate limiting headers using the pattern developed by the <a href="https://ietf-wg-httpapi.github.io/ratelimit-headers/draft-ietf-httpapi-ratelimit-headers.html" target="_blank" rel="noopener">IETF draft on rate limiting<span class="external-link"> ↗</span></a>. This allows API consumers to know how many more calls are left until the rate limit is reached, as well as how long you will need to wait until more capacity is available.</p> <p>Our SDKs automatically work with these new headers, backing off when rate limits are approached. There is no action required for users of the latest Cloudflare SDKs to take advantage of this.</p> <p>As always, if you need any help with rate limits, please contact Support.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-headers">New Headers</h4><a class="anchor-link" href="#new-headers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Headers that are always returned:</strong></p> <ul> <li><code>Ratelimit</code>: List of service limit items, composed of the limit name, the remaining quota (<code>r</code>) and the time next window resets (<code>t</code>). For example: <code>"default";r=50;t=30</code></li> <li><code>Ratelimit-Policy</code>: List of quota policy items, composed of the policy name, the total quota (<code>q</code>) and the time window the quota applies to (<code>w</code>). For example: <code>"burst";q=100;w=60</code></li> </ul> <p><strong>Returned only when a rate limit has been reached (error code: 429):</strong></p> <ul> <li>Retry-After: Number of Seconds until more capacity is available, rounded up</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sdk-back-offs">SDK Back offs</h4><a class="anchor-link" href="#sdk-back-offs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>All of Cloudflare's latest SDKs will automatically respond to the headers, instituting a backoff when limits are approached.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="graphql-and-edge-apis">GraphQL and Edge APIs</h4><a class="anchor-link" href="#graphql-and-edge-apis"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>These new headers and back offs are only available for Cloudflare REST APIs, and will not affect GraphQL.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-information">For more information</h4><a class="anchor-link" href="#for-more-information"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/api/reference/limits/" target="_blank" rel="noopener">Rate limits at Cloudflare<span class="external-link"> ↗</span></a></li> </ul>Wed, 03 Sep 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsLog Explorer - Logging headers and cookies using custom fieldshttps://developers.cloudflare.com/changelog/post/2025-09-03-log-headers-and-cookies/https://developers.cloudflare.com/changelog/post/2025-09-03-log-headers-and-cookies/<p><a href="https://developers.cloudflare.com/log-explorer/">Log Explorer</a> now supports logging and filtering on header or cookie fields in the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/http_requests/"><code>http_requests</code> dataset</a>.</p> <p>Create a custom field to log desired header or cookie values into the <code>http_requests</code> dataset and Log Explorer will import these as searchable fields. Once configured, use the custom SQL editor in Log Explorer to view or filter on these requests.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1790,height=404,format=webp/_astro/edit-custom-fields.Cy4qXSpL.png" alt="Edit Custom fields" loading="lazy" decoding="async" width="1790" height="404"> <p>For more details, refer to <a href="https://developers.cloudflare.com/log-explorer/log-search/#headers-and-cookies">Headers and cookies</a>.</p>Wed, 03 Sep 2025 00:00:00 GMTLog ExplorerLog ExplorerCloudflare Tunnel, Cloudflare Tunnel for SASE - Cloudflare Tunnel and Networks API will no longer return deleted resources by default starting December 1, 2025https://developers.cloudflare.com/changelog/post/2025-09-02-tunnel-networks-list-endpoints-new-default/https://developers.cloudflare.com/changelog/post/2025-09-02-tunnel-networks-list-endpoints-new-default/<p>Starting <strong>December 1, 2025</strong>, list endpoints for the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/">Cloudflare Tunnel API</a> and <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/">Zero Trust Networks API</a> will no longer return deleted tunnels, routes, subnets and virtual networks by default. This change makes the API behavior more intuitive by only returning active resources unless otherwise specified.</p> <p>No action is required if you already explicitly set <code>is_deleted=false</code> or if you only need to list active resources.</p> <p>This change affects the following API endpoints:</p> <ul> <li>List all tunnels: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/methods/list/"><code>GET /accounts/{account_id}/tunnels</code></a></li> <li>List <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnels</a>: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/methods/list/"><code>GET /accounts/{account_id}/cfd_tunnel</code></a></li> <li>List <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/">WARP Connector</a> tunnels: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/methods/list/"><code>GET /accounts/{account_id}/warp_connector</code></a></li> <li>List tunnel routes: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/list/"><code>GET /accounts/{account_id}/teamnet/routes</code></a></li> <li>List subnets: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/subnets/methods/list/"><code>GET /accounts/{account_id}/zerotrust/subnets</code></a></li> <li>List virtual networks: <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/virtual_networks/methods/list/"><code>GET /accounts/{account_id}/teamnet/virtual_networks</code></a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-is-changing">What is changing?</h4><a class="anchor-link" href="#what-is-changing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The default behavior of the <code>is_deleted</code> query parameter will be updated.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th style="text-align: left">Scenario</th> <th style="text-align: left">Previous behavior (before December 1, 2025)</th> <th style="text-align: left">New behavior (from December 1, 2025)</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><code>is_deleted</code> parameter is omitted</td> <td style="text-align: left">Returns <strong>active &amp; deleted</strong> tunnels, routes, subnets and virtual networks</td> <td style="text-align: left">Returns <strong>only active</strong> tunnels, routes, subnets and virtual networks</td> </tr> </tbody> </table></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="action-required">Action required</h4><a class="anchor-link" href="#action-required"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you need to retrieve deleted (or all) resources, please update your API calls to explicitly include the <code>is_deleted</code> parameter before <strong>December 1, 2025</strong>.</p> <p>To get a list of only deleted resources, you must now explicitly add the <code>is_deleted=true</code> query parameter to your request:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Example: Get ONLY deleted Tunnels</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/tunnels?is_deleted=true"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Example: Get ONLY deleted Virtual Networks</span></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-140thh">$ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/teamnet/virtual_networks?is_deleted=true"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> "Authorization: Bearer </span><span class="nb-shiki-140thh">$API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span></span></code></pre></figure> <p>Following this change, retrieving a complete list of both active and deleted resources will require two separate API calls: one to get active items (by omitting the parameter or using <code>is_deleted=false</code>) and one to get deleted items (<code>is_deleted=true</code>).</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-were-making-this-change">Why we’re making this change</h4><a class="anchor-link" href="#why-were-making-this-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This update is based on user feedback and aims to:</p> <ul> <li><strong>Create a more intuitive default:</strong> Aligning with common API design principles where list operations return only active resources by default.</li> <li><strong>Reduce unexpected results:</strong> Prevents users from accidentally operating on deleted resources that were returned unexpectedly.</li> <li><strong>Improve performance:</strong> For most users, the default query result will now be smaller and more relevant.</li> </ul> <p>To learn more, please visit the <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/">Cloudflare Tunnel API</a> and <a href="https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/">Zero Trust Networks API</a> documentation.</p>Tue, 02 Sep 2025 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEEmail security - Updated Email security roleshttps://developers.cloudflare.com/changelog/post/2025-09-01-updated-new-roles/https://developers.cloudflare.com/changelog/post/2025-09-01-updated-new-roles/<p>To provide more granular controls, we refined the <a href="https://developers.cloudflare.com/cloudflare-one/roles-permissions/#email-security-roles">existing roles</a> for Email security and launched a new Email security role as well.</p> <p>All Email security roles no longer have read or write access to any of the other Zero Trust products:</p> <ul> <li><strong>Email Configuration Admin</strong></li> <li><strong>Email Integration Admin</strong></li> <li><strong>Email security Read Only</strong></li> <li><strong>Email security Analyst</strong></li> <li><strong>Email security Policy Admin</strong></li> <li><strong>Email security Reporting</strong></li> </ul> <p>To configure <a href="https://developers.cloudflare.com/cloudflare-one/email-security/outbound-dlp/">Data Loss Prevention (DLP)</a> or <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/#set-up-clientless-web-isolation">Remote Browser Isolation (RBI)</a>, you now need to be an admin for the Zero Trust dashboard with the <strong>Cloudflare Zero Trust</strong> role.</p> <p>Also through customer feedback, we have created a new additive role to allow <strong>Email security Analyst</strong> to create, edit, and delete Email security policies, without needing to provide access via the <strong>Email Configuration Admin</strong> role. This role is called <strong>Email security Policy Admin</strong>, which can read all settings, but has write access to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/allow-policies/">allow policies</a>, <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/trusted-domains/">trusted domains</a>, and <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/blocked-senders/">blocked senders</a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Mon, 01 Sep 2025 23:25:49 GMTEmail securityEmail securityWAF - WAF Release - 2025-09-01https://developers.cloudflare.com/changelog/post/2025-09-01-waf-release/https://developers.cloudflare.com/changelog/post/2025-09-01-waf-release/ <p><strong>This week's update</strong></p> <p>This week, a critical vulnerability was disclosed in Fortinet FortiWeb (versions 7.6.3 and below, versions 7.4.7 and below, versions 7.2.10 and below, and versions 7.0.10 and below), linked to improper parameter handling that could allow unauthorized access.</p> <p><strong>Key Findings</strong></p> <ul> <li>Fortinet FortiWeb (CVE-2025-52970): A vulnerability may allow an unauthenticated remote attacker with access to non-public information to log in as any existing user on the device via a specially crafted request.</li> </ul> <p><strong>Impact</strong></p> <p>Exploitation could allow an unauthenticated attacker to impersonate any existing user on the device, potentially enabling them to modify system settings or exfiltrate sensitive information, posing a serious security risk. Upgrading to the latest vendor-released version is strongly recommended.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="636b145a49a84946b990d4fac49b7cf8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c49b7cf8</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100586</td><td>Fortinet FortiWeb - Auth Bypass - CVE:CVE-2025-52970</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b5ef1ace353841a0856b5e07790c9dde"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...790c9dde</span></button></rule-id></td><td>100136C</td><td>XSS - JavaScript - Headers and Body</td><td>N/A</td><td>N/A</td><td>Rule metadata description refined. Detection unchanged.</td></tr></tbody></table>Mon, 01 Sep 2025 00:00:00 GMTWAFWAFCache - Smart Tiered Cache Fallback to Generichttps://developers.cloudflare.com/changelog/post/2025-08-29-smart-tiered-cache-fallback-to-generic/https://developers.cloudflare.com/changelog/post/2025-08-29-smart-tiered-cache-fallback-to-generic/<p><a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#smart-tiered-cache">Smart Tiered Cache</a> now falls back to <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#generic-global-tiered-cache">Generic Tiered Cache</a> when the origin location cannot be determined, improving cache precision for your content.</p> <p>Previously, when Smart Tiered Cache was unable to select the optimal upper tier (such as when origins are masked by Anycast IPs), latency could be negatively impacted. This fallback now uses Generic Tiered Cache instead, providing better performance and cache efficiency.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When Smart Tiered Cache falls back to Generic Tiered Cache:</p> <ol> <li><strong>Multiple upper-tiers</strong>: Uses all of Cloudflare's global data centers as a network of upper-tiers instead of a single optimal location.</li> <li><strong>Distributed cache requests</strong>: Lower-tier data centers can query any available upper-tier for cached content.</li> <li><strong>Improved global coverage</strong>: Provides better cache hit ratios across geographically distributed visitors.</li> <li><strong>Automatic fallback</strong>: Seamlessly transitions when origin location cannot be determined, such as with Anycast-masked origins.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Preserves high performance during fallback</strong>: Smart Tiered Cache now maintains strong cache efficiency even when optimal upper tier selection is not possible.</li> <li><strong>Minimizes latency impact</strong>: Automatically uses Generic Tiered Cache topology to keep performance high when origin location cannot be determined.</li> <li><strong>Seamless experience</strong>: No configuration changes or intervention required when fallback occurs.</li> <li><strong>Improved resilience</strong>: Smart Tiered Cache remains effective across diverse origin infrastructure, including Anycast-masked origins.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This improvement is automatically applied to all zones using <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a>. No action is required on your part.</p>Fri, 29 Aug 2025 00:00:00 GMTCacheCacheCloudflare One Client - Cloudflare One WARP Diagnostic AI Analyzerhttps://developers.cloudflare.com/changelog/post/2025-08-29-warp-AI-diag-analyzer/https://developers.cloudflare.com/changelog/post/2025-08-29-warp-AI-diag-analyzer/<p>We're excited to share a new AI feature, the <a href="https://blog.cloudflare.com/ai-troubleshoot-warp-and-network-connectivity-issues/" target="_blank" rel="noopener">WARP diagnostic analyzer<span class="external-link"> ↗</span></a>, to help you troubleshoot and resolve WARP connectivity issues faster. This beta feature is now available in the <a href="https://dash.cloudflare.com/one/" target="_blank" rel="noopener">Cloudflare One dashboard<span class="external-link"> ↗</span></a> to all users. The AI analyzer makes it easier for you to identify the root cause of client connectivity issues by parsing <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/diagnostics/client-packet-capture/#start-a-remote-capture">remote captures</a> of <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#warp-diag-logs">WARP diagnostic logs</a>. The WARP diagnostic analyzer provides a summary of impact that may be experienced on the device, lists notable events that may contribute to performance issues, and recommended troubleshooting steps and articles to help you resolve these issues. Refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/diagnostics/client-packet-capture/#diagnostics-analyzer-beta">WARP diagnostics analyzer (beta)</a> to learn more about how to maximize using the WARP diagnostic analyzer to troubleshoot the WARP client.</p>Fri, 29 Aug 2025 00:00:00 GMTCloudflare One ClientCloudflare One ClientDigital Experience Monitoring - DEX MCP Serverhttps://developers.cloudflare.com/changelog/post/2025-08-29-dex-mcp-server/https://developers.cloudflare.com/changelog/post/2025-08-29-dex-mcp-server/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience Monitoring (DEX)</a> provides visibility into device connectivity and performance across your Cloudflare SASE deployment.</p> <p>We've released an MCP server <a href="https://cloudflare.com/learning/ai/what-is-model-context-protocol-mcp/" target="_blank" rel="noopener">(Model Context Protocol)<span class="external-link"> ↗</span></a> for DEX.</p> <p>The DEX MCP server is an AI tool that allows customers to ask a question like, "Show me the connectivity and performance metrics for the device used by carly‌@acme.com", and receive an answer that contains data from the DEX API.</p> <p>Any Cloudflare One customer using a Free, Pay-as-you-go, or Enterprise account can access the DEX MCP Server. This feature is available to everyone.</p> <p>Customers can test the new DEX MCP server in less than one minute. To learn more, read the <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/dex-mcp-server/">DEX MCP server documentation</a>.</p>Fri, 29 Aug 2025 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringCloudflare Fundamentals, Terraform - Terraform v5.9 now availablehttps://developers.cloudflare.com/changelog/post/2025-08-29-terrform-v5.9-provider/https://developers.cloudflare.com/changelog/post/2025-08-29-terrform-v5.9-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. We are aware of the high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by the Cloudflare community related to the v5 release. We have committed to releasing improvements on a 2 week cadence to ensure its stability and reliability, including the v5.9 release. We have also pivoted from an issue-to-issue approach to a resource-per-resource approach - we will be focusing on specific resources for every release, stabilizing the release, and closing all associated bugs with that resource before moving onto resolving migration issues.</p> <p>Thank you for continuing to raise issues. We triage them weekly and they help make our products stronger.</p> <p>This release includes a new resource, <code>cloudflare_snippet</code>, which replaces <code>cloudflare_snippets</code>. <code>cloudflare_snippet</code> is now considered deprecated but can still be used. Please utilize <code>cloudflare_snippet</code> as soon as possible.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Resources stabilized: <ul> <li><code>cloudflare_zone_setting</code></li> <li><code>cloudflare_worker_script</code></li> <li><code>cloudflare_worker_route</code></li> <li><code>tiered_cache</code></li> </ul> </li> <li><strong>NEW</strong> resource <code>cloudflare_snippet</code> which should be used in place of <code>cloudflare_snippets</code>. <code>cloudflare_snippets</code> is now deprecated. This enables the management of Cloudflare's snippet functionality through Terraform.</li> <li>DNS Record Improvements: Enhanced handling of DNS record drift detection</li> <li>Load Balancer Fixes: Resolved <code>created_on</code> field inconsistencies and improved pool configuration handling</li> <li>Bot Management: Enhanced auto-update model state consistency and fight mode configurations</li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, refer to the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.9.0" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5921" target="_blank" rel="noopener">#5921: In cloudflare_ruleset removing an existing rule causes recreation of later rules<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5904" target="_blank" rel="noopener">#5904: cloudflare_zero_trust_access_application is not idempotent<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5898" target="_blank" rel="noopener">#5898: (cloudflare_workers_script) Durable Object migrations not applied<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5892" target="_blank" rel="noopener">#5892: cloudflare_workers_script secret_text environment variable gets replaced on every deploy<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5891" target="_blank" rel="noopener">#5891: cloudflare_zone suddenly started showing drift<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5882" target="_blank" rel="noopener">#5882: cloudflare_zero_trust_list always marked for change due to read only attributes<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5879" target="_blank" rel="noopener">#5879: cloudflare_zero_trust_gateway_certificate unable to manage resource (cant mark as active/inactive)<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5858" target="_blank" rel="noopener">#5858: cloudflare_dns_records is always updated in-place<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5839" target="_blank" rel="noopener">#5839: Recurring change on cloudflare_zero_trust_gateway_policy after upgrade to V5 provider &amp; also setting expiration fails<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5811" target="_blank" rel="noopener">#5811: Reusable policies are imported as inline type for cloudflare_zero_trust_access_application<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5795" target="_blank" rel="noopener">#5795: cloudflare_zone_setting inconsistent value of "editable" upon apply<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5789" target="_blank" rel="noopener">#5789: Pagination issue fetching all policies in "cloudflare_zero_trust_access_policies" data source<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5770" target="_blank" rel="noopener">#5770: cloudflare_zero_trust_access_application type warp diff on every apply<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5765" target="_blank" rel="noopener">#5765: V5 / cloudflare_zone_dnssec fails with HTTP/400 "Malformed request body"<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5755" target="_blank" rel="noopener">#5755: Unable to manage Cloudflare managed WAF rules via Terraform<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5738" target="_blank" rel="noopener">#5738: v4 to v5 upgrade failing Error: no schema available AND Unable to Read Previously Saved State for UpgradeResourceState<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5727" target="_blank" rel="noopener">#5727: cloudflare_ruleset http_request_cache_settings bypass mismatch between dashboard and terraform<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5700" target="_blank" rel="noopener">#5700: cloudflare_account_member invalid type 'string' for field 'roles'<span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new issue if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest holding off on migration to v5 while we work on stabilization. This help will you avoid any blocking issues while the Terraform resources are actively being stabilized.</p> <p>If you'd like more information on migrating from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition. These do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub Repository<span class="external-link"> ↗</span></a></li> </ul>Fri, 29 Aug 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - WAF Release - 2025-08-29 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-08-29-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-29-emergency-waf-release/ <p><strong>This week's update</strong></p> <p>This week, new critical vulnerabilities were disclosed in Next.js’s image optimization functionality, exposing a broad range of production environments to risks of data exposure and cache manipulation.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>CVE-2025-55173: Arbitrary file download from the server via image optimization.</p> </li> <li> <p>CVE-2025-57752: Cache poisoning leading to unauthorized data disclosure.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Exploitation could expose sensitive files, leak user or backend data, and undermine application trust. Given Next.js’s wide use, immediate patching and cache hardening are strongly advised.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ea55f8aac44246cc9b827eea9ff4bfe3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9ff4bfe3</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100613</td><td>Next.js - Dangerous File Download - CVE:CVE-2025-55173</td><td>N/A</td><td>Block</td><td>This is a new detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e2b2d77a79cc4a76bf7ba53d69b9ea7d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...69b9ea7d</span></button></rule-id></td><td>100616</td><td>Next.js - Information Disclosure - CVE:CVE-2025-57752</td><td>N/A</td><td>Block</td><td>This is a new detection</td></tr></tbody></table>Fri, 29 Aug 2025 00:00:00 GMTWAFWAFAI Crawl Control - Enhanced crawler insights and custom 402 responseshttps://developers.cloudflare.com/changelog/post/2025-08-27-ai-crawl-control-launch/https://developers.cloudflare.com/changelog/post/2025-08-27-ai-crawl-control-launch/<p>We improved AI crawler management with detailed analytics and introduced custom HTTP 402 responses for blocked crawlers. AI Audit has been renamed to AI Crawl Control and is now generally available.</p> <p><strong>Enhanced Crawlers tab:</strong></p> <ul> <li>View total allowed and blocked requests for each AI crawler</li> <li>Trend charts show crawler activity over your selected time range per crawler</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1335,height=984,format=webp/_astro/ai-crawl-control-table.BDr0Qd-5.png" alt="Updated AI Crawl Control table showing request counts and trend charts" loading="lazy" decoding="async" width="1335" height="984"> <p><strong>Custom block responses (paid plans):</strong> You can now return HTTP 402 "Payment Required" responses when blocking AI crawlers, enabling direct communication with crawler operators about licensing terms.</p> <p>For users on paid plans, when blocking AI crawlers you can configure:</p> <ul> <li><strong>Response code:</strong> Choose between 403 Forbidden or 402 Payment Required</li> <li><strong>Response body:</strong> Add a custom message with your licensing contact information</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1327,height=419,format=webp/_astro/ai-crawl-control-block-response.L4duQj7-.png" alt="AI Crawl Control block response configuration interface" loading="lazy" decoding="async" width="1327" height="419"> <p>Example 402 response:</p> <figure class="nb-code-figure" data-nb-lang="http"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="http" data-nb-lang="http"><code><span class="line"><span class="nb-shiki-140thh">HTTP 402 Payment Required</span></span> <span class="line"><span class="nb-shiki-17hn0y">Date</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> Mon, 24 Aug 2025 12:56:49 GMT</span></span> <span class="line"><span class="nb-shiki-17hn0y">Content-type</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> application/json</span></span> <span class="line"><span class="nb-shiki-17hn0y">Server</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> cloudflare</span></span> <span class="line"><span class="nb-shiki-17hn0y">Cf-Ray</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> 967e8da599d0c3fa-EWR</span></span> <span class="line"><span class="nb-shiki-17hn0y">Cf-Team</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-mdbnqw"> 2902f6db750000c3fa1e2ef400000001</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "message"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Please contact the site owner for access."</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure>Wed, 27 Aug 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlGateway, Cloudflare One - Shadow IT - SaaS analytics dashboardhttps://developers.cloudflare.com/changelog/post/2025-08-27-shadow-it-analytics/https://developers.cloudflare.com/changelog/post/2025-08-27-shadow-it-analytics/<p>Zero Trust has significantly upgraded its <strong>Shadow IT analytics</strong>, providing you with unprecedented visibility into your organizations use of SaaS tools. With this dashboard, you can review who is using an application and volumes of data transfer to the application.</p> <p>You can review these metrics against application type, such as Artificial Intelligence or Social Media. You can also mark applications with an approval status, including <strong>Unreviewed</strong>, <strong>In Review</strong>, <strong>Approved</strong>, and <strong>Unapproved</strong> designating how they can be used in your organization.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2814,height=1486,format=webp/_astro/shadow-it-analytics.BLNnG72w.png" alt="Cloudflare One Analytics Dashboards" loading="lazy" decoding="async" width="2814" height="1486"> <p>These application statuses can also be used in Gateway HTTP policies, so you can block, isolate, limit uploads and downloads, and more based on the application status.</p> <p>Both the analytics and policies are accessible in the Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>, empowering organizations with better visibility and control.</p>Wed, 27 Aug 2025 00:00:00 GMTGatewayGatewayCloudflare OneWorkers AI - Deepgram and Leonardo partner models now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2025-08-27-partner-models/https://developers.cloudflare.com/changelog/post/2025-08-27-partner-models/<p>New state-of-the-art models have landed on Workers AI! This time, we're introducing new <strong>partner models</strong> trained by our friends at <a href="https://deepgram.com" target="_blank" rel="noopener">Deepgram<span class="external-link"> ↗</span></a> and <a href="https://leonardo.ai" target="_blank" rel="noopener">Leonardo<span class="external-link"> ↗</span></a>, hosted on Workers AI infrastructure.</p> <p>As well, we're introuding a new turn detection model that enables you to detect when someone is done speaking — useful for building voice agents!</p> <p>Read the <a href="https://blog.cloudflare.com/workers-ai-partner-models" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> for more details and check out some of the new models on our platform:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/aura-1"><code>@cf/deepgram/aura-1</code></a> is a text-to-speech model that allows you to input text and have it come to life in a customizable voice</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/nova-3"><code>@cf/deepgram/nova-3</code></a> is speech-to-text model that transcribes multilingual audio at a blazingly fast speed</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/smart-turn-v2"><code>@cf/pipecat-ai/smart-turn-v2</code></a> helps you detect when someone is done speaking</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/lucid-origin"><code>@cf/leonardo/lucid-origin</code></a> is a text-to-image model that generates images with sharp graphic design, stunning full-HD renders, or highly specific creative direction</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/phoenix-1.0"><code>@cf/leonardo/phoenix-1.0</code></a> is a text-to-image model with exceptional prompt adherence and coherent text</li> </ul> <p>You can filter out new partner models with the <code>Partner</code> capability on our <a href="https://developers.cloudflare.com/workers-ai/models">Models</a> page.</p> <p>As well, we're introducing WebSocket support for some of our audio models, which you can filter though the <code>Realtime</code> capability on our <a href="https://developers.cloudflare.com/workers-ai/models">Models</a> page. WebSockets allows you to create a bi-directional connection to our inference server with low latency — perfect for those that are building voice agents.</p> <p>An example python snippet on how to use WebSockets with our new Aura model:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">import json</span></span> <span class="line"><span class="nb-shiki-wvjl67">import os</span></span> <span class="line"><span class="nb-shiki-wvjl67">import asyncio</span></span> <span class="line"><span class="nb-shiki-wvjl67">import websockets</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">uri = f"wss://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/run/@cf/deepgram/aura-1"</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">input = [</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "Line one, out of three lines that will be provided to the aura model.",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "Line two, out of three lines that will be provided to the aura model.",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "Line three, out of three lines that will be provided to the aura model. This is a last line.",</span></span> <span class="line"><span class="nb-shiki-wvjl67">]</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">async def text_to_speech():</span></span> <span class="line"><span class="nb-shiki-wvjl67"> async with websockets.connect(uri, additional_headers={"Authorization": os.getenv("CF_TOKEN")}) as websocket:</span></span> <span class="line"><span class="nb-shiki-wvjl67"> print("connection established")</span></span> <span class="line"><span class="nb-shiki-wvjl67"> for line in input:</span></span> <span class="line"><span class="nb-shiki-wvjl67"> print(f"sending `{line}`")</span></span> <span class="line"><span class="nb-shiki-wvjl67"> await websocket.send(json.dumps({"type": "Speak", "text": line}))</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"> print("line was sent, flushing")</span></span> <span class="line"><span class="nb-shiki-wvjl67"> await websocket.send(json.dumps({"type": "Flush"}))</span></span> <span class="line"><span class="nb-shiki-wvjl67"> print("flushed, recving")</span></span> <span class="line"><span class="nb-shiki-wvjl67"> resp = await websocket.recv()</span></span> <span class="line"><span class="nb-shiki-wvjl67"> print(f"response received {resp}")</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">if __name__ == "__main__":</span></span> <span class="line"><span class="nb-shiki-wvjl67"> asyncio.run(text_to_speech())</span></span></code></pre></figure>Wed, 27 Aug 2025 00:00:00 GMTWorkers AIWorkers AICASB - New CASB integrations for ChatGPT, Claude, and Geminihttps://developers.cloudflare.com/changelog/post/2025-08-26-casb-ai-integrations/https://developers.cloudflare.com/changelog/post/2025-08-26-casb-ai-integrations/<p><a href="https://www.cloudflare.com/zero-trust/products/casb/" target="_blank" rel="noopener">Cloudflare CASB<span class="external-link"> ↗</span></a> now supports three of the most widely used GenAI platforms — <strong>OpenAI ChatGPT</strong>, <strong>Anthropic Claude</strong>, and <strong>Google Gemini</strong>. These API-based integrations give security teams agentless visibility into posture, data, and compliance risks across their organization’s use of generative AI.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2335,height=1776,format=webp/_astro/casb-ai-integrations-preview.B-zsSA1P.png" alt="Cloudflare CASB showing selection of new findings for ChatGPT, Claude, and Gemini integrations." loading="lazy" decoding="async" width="2335" height="1776"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="key-capabilities">Key capabilities</h4><a class="anchor-link" href="#key-capabilities"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Agentless connections</strong> — connect ChatGPT, Claude, and Gemini tenants via API; no endpoint software required</li> <li><strong>Posture management</strong> — detect insecure settings and misconfigurations that could lead to data exposure</li> <li><strong>DLP detection</strong> — identify sensitive data in uploaded chat attachments or files</li> <li><strong>GenAI-specific insights</strong> — surface risks unique to each provider’s capabilities</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="learn-more">Learn more</h4><a class="anchor-link" href="#learn-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/openai/" target="_blank" rel="noopener">ChatGPT integration docs<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/anthropic/" target="_blank" rel="noopener">Claude integration docs<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/google-workspace/gemini/" target="_blank" rel="noopener">Gemini integration docs<span class="external-link"> ↗</span></a></li> </ul> <p>These integrations are available to all Cloudflare One customers today.</p>Tue, 26 Aug 2025 16:00:00 GMTCASBCASBAccess - Manage and restrict access to internal MCP servers with Cloudflare Accesshttps://developers.cloudflare.com/changelog/post/2025-08-26-access-mcp-oauth/https://developers.cloudflare.com/changelog/post/2025-08-26-access-mcp-oauth/<p>You can now control who within your organization has access to internal MCP servers, by putting internal MCP servers behind <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a>.</p> <p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/linked-apps/">Self-hosted applications</a> in Cloudflare Access now support OAuth for MCP server authentication. This allows Cloudflare to delegate access from any self-hosted application to an MCP server via OAuth. The OAuth access token authorizes the MCP server to make requests to your self-hosted applications on behalf of the authorized user, using that user's specific permissions and scopes.</p> <p>For example, if you have an MCP server designed for internal use within your organization, you can configure Access policies to ensure that only authorized users can access it, regardless of which MCP client they use. Support for internal, self-hosted MCP servers also works with MCP server portals, allowing you to provide a single MCP endpoint for multiple MCP servers. For more on MCP server portals, read the <a href="https://blog.cloudflare.com/zero-trust-mcp-server-portals/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a> on the Cloudflare Blog.</p>Tue, 26 Aug 2025 00:00:00 GMTAccessAccessAccess - MCP server portalshttps://developers.cloudflare.com/changelog/post/2025-08-26-mcp-server-portals/https://developers.cloudflare.com/changelog/post/2025-08-26-mcp-server-portals/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1557,height=420,format=webp/_astro/mcp-server-portal.BOKqTCoI.png" alt="MCP server portal" loading="lazy" decoding="async" width="1557" height="420"> <p>An <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/">MCP server portal</a> centralizes multiple Model Context Protocol (MCP) servers onto a single HTTP endpoint. Key benefits include:</p> <ul> <li><strong>Streamlined access to multiple MCP servers</strong>: MCP server portals support both unauthenticated MCP servers as well as MCP servers secured using any third-party or custom OAuth provider. Users log in to the portal URL through Cloudflare Access and are prompted to authenticate separately to each server that requires OAuth.</li> <li><strong>Customized tools per portal</strong>: Admins can tailor an MCP portal to a particular use case by choosing the specific tools and prompt templates that they want to make available to users through the portal. This allows users to access a curated set of tools and prompts — the less external context exposed to the AI model, the better the AI responses tend to be.</li> <li><strong>Observability</strong>: Once the user's AI agent is connected to the portal, Cloudflare Access logs the individual requests made using the tools in the portal.</li> </ul> <p>This is available in an open beta for all customers across all plans! For more information check out our <a href="https://blog.cloudflare.com/zero-trust-mcp-server-portals/" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> for this release.</p>Tue, 26 Aug 2025 00:00:00 GMTAccessAccessVectorize - List all vectors in a Vectorize index with the new list-vectors operationhttps://developers.cloudflare.com/changelog/post/2025-08-26-vectorize-list-vectors/https://developers.cloudflare.com/changelog/post/2025-08-26-vectorize-list-vectors/<p>You can now list all vector identifiers in a Vectorize index using the new <code>list-vectors</code> operation. This enables bulk operations, auditing, and data migration workflows through paginated requests that maintain snapshot consistency.</p> <p>The operation is available via Wrangler CLI and REST API. Refer to the <a href="https://developers.cloudflare.com/vectorize/best-practices/list-vectors/">list-vectors best practices guide</a> for detailed usage guidance.</p>Tue, 26 Aug 2025 00:00:00 GMTVectorizeVectorizeSecrets Store, AI Gateway, SSL/TLS - Manage and deploy your AI provider keys through Bring Your Own Key (BYOK) with AI Gateway, now powered by Cloudflare Secrets Storehttps://developers.cloudflare.com/changelog/post/2025-08-25-secrets-store-ai-gateway/https://developers.cloudflare.com/changelog/post/2025-08-25-secrets-store-ai-gateway/ <p>Cloudflare Secrets Store is now integrated with AI Gateway, allowing you to store, manage, and deploy your AI provider keys in a secure and seamless configuration through <a href="https://developers.cloudflare.com/ai-gateway/configuration/bring-your-own-keys/" target="_blank" rel="noopener">Bring Your Own Key<span class="external-link"> ↗</span></a>. Instead of passing your AI provider keys directly in every request header, you can centrally manage each key with Secrets Store and deploy in your gateway configuration using only a reference, rather than passing the value in plain text.</p> <p>You can now create a secret directly from your AI Gateway <a href="http://dash.cloudflare.com/?to=/:account/ai-gateway" target="_blank" rel="noopener">in the dashboard<span class="external-link"> ↗</span></a> by navigating into your gateway -&gt; <strong>Provider Keys</strong> -&gt; <strong>Add</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2410,height=1842,format=webp/_astro/add-secret-ai-gateway.B-SIPr6s.png" alt="Import repo or choose template" loading="lazy" decoding="async" width="2410" height="1842"> <p>You can also create your secret with the newly available <strong>ai_gateway</strong> scope via <a href="https://developers.cloudflare.com/workers/wrangler/commands/" target="_blank" rel="noopener">wrangler<span class="external-link"> ↗</span></a>, the <a href="http://dash.cloudflare.com/?to=/:account/secrets-store" target="_blank" rel="noopener">Secrets Store dashboard<span class="external-link"> ↗</span></a>, or the <a href="https://developers.cloudflare.com/api/resources/secrets_store/" target="_blank" rel="noopener">API<span class="external-link"> ↗</span></a>.</p> <p>Then, pass the key in the request header using its Secrets Store reference:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">ACCOUNT_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">/my-gateway/anthropic/v1/messages</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'cf-aig-authorization: ANTHROPIC_KEY_1 \</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> --header 'anthropic-version:</span><span class="nb-shiki-mdbnqw"> 2023-06-01' \</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> --header 'Content-Type:</span><span class="nb-shiki-mdbnqw"> application/json' \</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> --data '{"model":</span><span class="nb-shiki-mdbnqw"> "claude-3-opus-20240229",</span><span class="nb-shiki-mdbnqw"> "messages":</span><span class="nb-shiki-140thh"> [{</span><span class="nb-shiki-1t8gfj">"role"</span><span class="nb-shiki-dzsirb">:</span><span class="nb-shiki-mdbnqw"> "user",</span><span class="nb-shiki-mdbnqw"> "content":</span><span class="nb-shiki-mdbnqw"> "What is Cloudflare?"}]}'</span></span></code></pre></figure> <p>Or, using Javascript:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">import Anthropic from '@anthropic-ai/sdk';</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">const anthropic = new Anthropic({</span></span> <span class="line"><span class="nb-shiki-wvjl67"> apiKey: "ANTHROPIC_KEY_1",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> baseURL: "https://gateway.ai.cloudflare.com/v1/&lt;ACCOUNT_ID&gt;/my-gateway/anthropic",</span></span> <span class="line"><span class="nb-shiki-wvjl67">});</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67">const message = await anthropic.messages.create({</span></span> <span class="line"><span class="nb-shiki-wvjl67"> model: 'claude-3-opus-20240229',</span></span> <span class="line"><span class="nb-shiki-wvjl67"> messages: [{role: "user", content: "What is Cloudflare?"}],</span></span> <span class="line"><span class="nb-shiki-wvjl67"> max_tokens: 1024</span></span> <span class="line"><span class="nb-shiki-wvjl67">});</span></span></code></pre></figure> <p>For more information, check out the <a href="https://blog.cloudflare.com/ai-gateway-aug-2025-refresh" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a>!</p>Mon, 25 Aug 2025 11:00:00 GMTSecrets StoreSecrets StoreAI GatewaySSL/TLSData Loss Prevention - New DLP topic based detection entries for AI prompt protectionhttps://developers.cloudflare.com/changelog/post/2025-08-25-ai-prompt-protection/https://developers.cloudflare.com/changelog/post/2025-08-25-ai-prompt-protection/<p>You now have access to a comprehensive suite of capabilities to secure your organization's use of generative AI. AI prompt protection introduces four key features that work together to provide deep visibility and granular control.</p> <ol> <li><strong>Prompt Detection for AI Applications</strong></li> </ol> <p>DLP can now natively detect and inspect user prompts submitted to popular AI applications, including <strong>Google Gemini</strong>, <strong>ChatGPT</strong>, <strong>Claude</strong>, and <strong>Perplexity</strong>.</p> <ol start="2"> <li><strong>Prompt Analysis and Topic Classification</strong></li> </ol> <p>Our DLP engine performs deep analysis on each prompt, applying <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics">topic classification</a>. These topics are grouped into two evaluation categories:</p> <ul> <li> <p><strong>Content:</strong> PII, Source Code, Credentials and Secrets, Financial Information, and Customer Data.</p> </li> <li> <p><strong>Intent:</strong> Jailbreak attempts, requests for malicious code, or attempts to extract PII.</p> </li> </ul> <p>To help you apply these topics quickly, we have also released five new predefined profiles (for example, AI Prompt: AI Security, AI Prompt: PII) that bundle these new topics.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=728,height=439,format=webp/_astro/ai-prompt-detection-entry.4QmdkAuv.png" alt="DLP" loading="lazy" decoding="async" width="728" height="439"><ol start="3"><li> <p><strong>Granular Guardrails</strong></p> <p>You can now build guardrails using Gateway HTTP policies with <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#granular-controls">application granular controls</a>. Apply a DLP profile containing an <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics">AI prompt topic detection</a> to individual AI applications (for example, <code>ChatGPT</code>) and specific user actions (for example, <code>SendPrompt</code>) to block sensitive prompts.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=731,height=511,format=webp/_astro/ai-prompt-policy.CF3H2rbK.png" alt="DLP" loading="lazy" decoding="async" width="731" height="511"></li><li> <p><strong>Full Prompt Logging</strong></p> <p>To aid in incident investigation, an optional setting in your Gateway policy allows you to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-policies/logging-options/#log-generative-ai-prompt-content">capture prompt logs</a> to store the full interaction of prompts that trigger a policy match. To make investigations easier, logs can be filtered by <code>conversation_id</code>, allowing you to reconstruct the full context of an interaction that led to a policy violation.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=728,height=444,format=webp/_astro/ai-prompt-log.ywQDc5qN.png" alt="DLP" loading="lazy" decoding="async" width="728" height="444"></li></ol> <p>AI prompt protection is now available in open beta. To learn more about it, read the <a href="https://blog.cloudflare.com/ai-prompt-protection/#closing-the-loop-logging" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> or refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics">AI prompt topics</a>.</p>Mon, 25 Aug 2025 00:00:00 GMTData Loss PreventionData Loss PreventionWAF - WAF Release - 2025-08-25https://developers.cloudflare.com/changelog/post/2025-08-25-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-25-waf-release/ <p><strong>This week's update</strong></p> <p>This week, critical vulnerabilities were disclosed that impact widely used open-source infrastructure, creating high-risk scenarios for code execution and operational disruption.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Apache HTTP Server – Code Execution (CVE-2024-38474): A flaw in Apache HTTP Server allows attackers to achieve remote code execution, enabling full compromise of affected servers. This vulnerability threatens the confidentiality, integrity, and availability of critical web services.</p> </li> <li> <p>Laravel (CVE-2024-55661): A security flaw in Laravel introduces the potential for remote code execution under specific conditions. Exploitation could provide attackers with unauthorized access to application logic and sensitive backend data.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities pose severe risks to enterprise environments and open-source ecosystems. Remote code execution enables attackers to gain deep system access, steal data, disrupt services, and establish persistent footholds for broader intrusions. Given the widespread deployment of Apache HTTP Server and Laravel in production systems, timely patching and mitigation are critical.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c550282a0f7343ca887bdab528050359"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...28050359</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100822_BETA</td><td>WordPress:Plugin:WPBookit - Remote Code Execution - CVE:CVE-2025-6058</td><td>N/A</td><td>Disabled</td><td>This was merged in to the original rule "WordPress:Plugin:WPBookit - Remote Code Execution - CVE:CVE-2025-6058" (ID: <rule-id id="9b5c5e13d2ca4253a89769f2194f7b2d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...194f7b2d</span></button></rule-id>)</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="456b1e8f827b4ed89fb4a54b3bdcdbad"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3bdcdbad</span></button></rule-id></td><td>100831</td><td>Apache HTTP Server - Code Execution - CVE:CVE-2024-38474</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7dcc01e1dd074e42a26c8ca002eaac5b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...02eaac5b</span></button></rule-id></td><td>100846</td><td>Laravel - Remote Code Execution - CVE:CVE-2024-55661</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 25 Aug 2025 00:00:00 GMTWAFWAFWorkers - Content type returned in Workers Assets for Javascript files is now `text/javascript`https://developers.cloudflare.com/changelog/post/2025-08-25-workers-assets-javascript-content-type/https://developers.cloudflare.com/changelog/post/2025-08-25-workers-assets-javascript-content-type/<p>JavaScript asset responses have been updated to use the <code>text/javascript</code> Content-Type header instead of <code>application/javascript</code>. While both MIME types are widely supported by browsers, the HTML Living Standard explicitly recommends <code>text/javascript</code> as the preferred type going forward.</p> <p>This change improves:</p> <ul> <li>Standards alignment: Ensures consistency with the HTML spec and modern web platform guidance.</li> <li>Interoperability: Some developer tools, validators, and proxies expect text/javascript and may warn or behave inconsistently with application/javascript.</li> <li>Future-proofing: By following the spec-preferred MIME type, we reduce the risk of deprecation warnings or unexpected behavior in evolving browser environments.</li> <li>Consistency: Most frameworks, CDNs, and hosting providers now default to text/javascript, so this change matches common ecosystem practice.</li> </ul> <p>Because all major browsers accept both MIME types, this update is backwards compatible and should not cause breakage.</p> <p>Users will see this change on the next deployment of their assets.</p>Mon, 25 Aug 2025 00:00:00 GMTWorkersWorkersKV - Workers KV completes hybrid storage provider rollout for improved performance, fault-tolerancehttps://developers.cloudflare.com/changelog/post/2025-08-22-kv-performance-improvements/https://developers.cloudflare.com/changelog/post/2025-08-22-kv-performance-improvements/<p>Workers KV has completed rolling out performance improvements across all KV namespaces, providing a significant latency reduction on read operations for all KV users. This is due to architectural changes to KV's underlying storage infrastructure, which introduces a new metadata later and substantially improves redundancy.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1486,height=796,format=webp/_astro/kv-hybrid-providers-performance-improvements.D6MBO22S.png" alt="Workers KV latency improvements showing P95 and P99 performance gains in Europe, Asia, Africa and Middle East regions as measured within KV's internal storage gateway worker." loading="lazy" decoding="async" width="1486" height="796"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="performance-improvements">Performance improvements</h4><a class="anchor-link" href="#performance-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new hybrid architecture delivers substantial latency reductions throughout Europe, Asia, Middle East, Africa regions. Over the past 2 weeks, we have observed the following:</p> <ul> <li><strong>p95 latency</strong>: Reduced from ~150ms to ~50ms (67% decrease)</li> <li><strong>p99 latency</strong>: Reduced from ~350ms to ~250ms (29% decrease)</li> </ul>Fri, 22 Aug 2025 12:00:00 GMTKVKVAudit Logs - Audit logs (version 2) - Logpush Beta Releasehttps://developers.cloudflare.com/changelog/post/2025-08-22-audit-logs-v2-logpush/https://developers.cloudflare.com/changelog/post/2025-08-22-audit-logs-v2-logpush/<p><a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/audit_logs_v2/">Audit Logs v2 dataset</a> is now available via Logpush.</p> <p>This expands on earlier releases of Audit Logs v2 in the <a href="https://developers.cloudflare.com/changelog/2025-03-27-automatic-audit-logs-beta-release/">API</a> and <a href="https://developers.cloudflare.com/changelog/2025-07-29-audit-logs-v2-ui-beta/">Dashboard UI</a>.</p> <p>We recommend creating a new Logpush job for the Audit Logs v2 dataset.</p> <p>Timelines for General Availability (GA) of Audit Logs v2 and the retirement of Audit Logs v1 will be shared in upcoming updates.</p> <p>For more details on Audit Logs v2, refer to the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/" target="_blank" rel="noopener">Audit Logs documentation<span class="external-link"> ↗</span></a>.</p>Fri, 22 Aug 2025 00:00:00 GMTAudit LogsAudit LogsLogs - Dedicated Egress IP for Logpushhttps://developers.cloudflare.com/changelog/post/2025-08-22-dedicated-egress-ip-logpush/https://developers.cloudflare.com/changelog/post/2025-08-22-dedicated-egress-ip-logpush/<p>Cloudflare Logpush can now deliver logs from using fixed, dedicated egress IPs. By routing Logpush traffic through a Cloudflare zone enabled with <a href="https://developers.cloudflare.com/smart-shield/configuration/dedicated-egress-ips/">Aegis IP</a>, your log destination only needs to allow Aegis IPs making setup more secure.</p> <p>Highlights:</p> <ul> <li>Fixed egress IPs ensure your destination only accepts traffic from known addresses.</li> <li>Works with any supported Logpush destination.</li> <li>Recommended to use a dedicated zone as a proxy for easier management.</li> </ul> <p>To get started, work with your Cloudflare account team to provision Aegis IPs, then configure your Logpush job to deliver logs through the proxy zone. For full setup instructions, refer to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/egress-ip/">Logpush documentation</a>.</p>Fri, 22 Aug 2025 00:00:00 GMTLogsLogsWAF - WAF Release - 2025-08-22https://developers.cloudflare.com/changelog/post/2025-08-22-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-22-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0f3b6b9377334707b604be925fcca5c8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5fcca5c8</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100850</td><td>Command Injection - Generic 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="36b0532eb3c941449afed2d3744305c4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...744305c4</span></button></rule-id></td><td>100851</td><td>Remote Code Execution - Java Deserialization</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5d3c0d0958d14512bd2a7d902b083459"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2b083459</span></button></rule-id></td><td>100852</td><td>Command Injection - Generic 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6e2f7a696ea74c979e7d069cefb7e5b9"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...efb7e5b9</span></button></rule-id></td><td>100853</td><td>Remote Code Execution - Common Bash Bypass Beta</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="735666d7268545a5ae6cfd0b78513ad7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...78513ad7</span></button></rule-id></td><td>100854</td><td>XSS - Generic JavaScript</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="82780ba6f5df49dcb8d09af0e9a5daac"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e9a5daac</span></button></rule-id></td><td>100855</td><td>Command Injection - Generic 4</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8e305924a7dc4f91a2de931a480f6093"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...480f6093</span></button></rule-id></td><td>100856</td><td>PHP Object Injection</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1d34e0d05c10473ca824e66fd4ae0a33"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d4ae0a33</span></button></rule-id></td><td>100857</td><td>Generic - Parameter Fuzzing</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b517e4b79d7a47fbb61f447b1121ee45"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1121ee45</span></button></rule-id></td><td>100858</td><td>Code Injection - Generic 4</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1f9accf629dc42cb84a7a14420de01e3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...20de01e3</span></button></rule-id></td><td>100859</td><td>SQLi - UNION - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e95939eacf7c4484b47101d5c0177e21"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c0177e21</span></button></rule-id></td><td>100860</td><td>Command Injection - Generic 5</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7b426e6f456043f4a21c162085f4d7b3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...85f4d7b3</span></button></rule-id></td><td>100861</td><td>Command Execution - Generic</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5fac82bd1c03463fb600cfa83fa8ee7f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3fa8ee7f</span></button></rule-id></td><td>100862</td><td>GraphQL Injection - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ab2cb1f2e2ad4da6a2685b1dc7a41d4b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c7a41d4b</span></button></rule-id></td><td>100863</td><td>Command Injection - Generic 6</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="549b4fe1564a448d848365d565e3c165"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...65e3c165</span></button></rule-id></td><td>100864</td><td>Code Injection - Generic 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8ef3c3f91eef46919cc9cb6d161aafdc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...161aafdc</span></button></rule-id></td><td>100865</td><td>PHP Object Injection - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="57e8ba867e6240d2af8ea0611cc3c3f8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1cc3c3f8</span></button></rule-id></td><td>100866</td><td>SQLi - LIKE 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a967a167874b42b6898be46e48ac2221"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...48ac2221</span></button></rule-id></td><td>100867</td><td>SQLi - DROP - 2</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cf79a868cc934bcc92b86ff01f4eec13"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1f4eec13</span></button></rule-id></td><td>100868</td><td>Code Injection - Generic 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="97a52405eaae47ae9627dbb22755f99e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2755f99e</span></button></rule-id></td><td>100869</td><td>Command Injection - Generic 7</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5b3ce84c099040c6a25cee2d413592e2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...413592e2</span></button></rule-id></td><td>100870</td><td>Command Injection - Generic 8</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5940a9ace2f04d078e35d435d2dd41b5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d2dd41b5</span></button></rule-id></td><td>100871</td><td>SQLi - LIKE 3</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Fri, 22 Aug 2025 00:00:00 GMTWAFWAFWorkflows, Workers - Build durable multi-step applications in Python with Workflows (now in beta)https://developers.cloudflare.com/changelog/post/2025-08-22-workflows-python-beta/https://developers.cloudflare.com/changelog/post/2025-08-22-workflows-python-beta/ <p>You can now build <a href="https://developers.cloudflare.com/workflows/">Workflows</a> using Python. With Python Workflows, you get automatic retries, state persistence, and the ability to run multi-step operations that can span minutes, hours, or weeks using Python’s familiar syntax and the <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers</a> runtime.</p> <p>Python Workflows use the same step-based execution model as JavaScript Workflows, but with Python syntax and access to Python’s ecosystem. Python Workflows also enable <a href="https://developers.cloudflare.com/workflows/python/dag/">DAG (Directed Acyclic Graph) workflows</a>, where you can define complex dependencies between steps using the depends parameter.</p> <p>Here’s a simple example:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Response, WorkflowEntrypoint</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> PythonWorkflowStarter</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkflowEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(self, event, step):</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> @step.do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my first step"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> my_first_step</span><span class="nb-shiki-140thh">():</span></span> <span class="line"><span class="nb-shiki-21nrsd"> # do some work</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> "Hello Python!"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> my_first_step()</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.sleep(</span><span class="nb-shiki-mdbnqw">"my-sleep-step"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"10 seconds"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> @step.do</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my second step"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> my_second_step</span><span class="nb-shiki-140thh">():</span></span> <span class="line"><span class="nb-shiki-21nrsd"> # do some more work</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> "Hello again!"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> my_second_step()</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> Default</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkerEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(self, request):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> self</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">MY_WORKFLOW</span><span class="nb-shiki-140thh">.create()</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response(</span><span class="nb-shiki-mdbnqw">"Hello Workflow creation!"</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Python Workflows requires a <code>compatibility_date = "2025-08-01"</code>, or lower, in your wrangler toml file.</p></div></div></aside> <p>Python Workflows support the same core capabilities as JavaScript Workflows, including sleep scheduling, event-driven workflows, and built-in error handling with configurable retry policies.</p> <p>To learn more and get started, refer to <a href="https://developers.cloudflare.com/workflows/python/">Python Workflows documentation</a>.</p>Fri, 22 Aug 2025 00:00:00 GMTWorkflowsWorkflowsWorkersCloudflare One Client - WARP client for Windows (version 2025.6.1400.0)https://developers.cloudflare.com/changelog/post/2025-08-21-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2025-08-21-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains a hotfix for pre-login for multi-user for the 2025.6.1135.0 release.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixes an issue where new pre-login registrations were not being properly created.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about Win32/ClickFix.ABA being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, please reconnect the WARP client by toggling off and back on.</p> </li> </ul> Thu, 21 Aug 2025 22:36:07 GMTCloudflare One ClientCloudflare One ClientDurable Objects, Workers - New getByName() API to access Durable Objectshttps://developers.cloudflare.com/changelog/post/2025-08-21-durable-objects-get-by-name/https://developers.cloudflare.com/changelog/post/2025-08-21-durable-objects-get-by-name/<p>You can now create a client (a <a href="https://developers.cloudflare.com/durable-objects/api/stub/">Durable Object stub</a>) to a Durable Object with the new <code>getByName</code> method, removing the need to convert Durable Object names to IDs and then create a stub.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Before: (1) translate name to ID then (2) get a client </span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> objectId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">idFromName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"foo"</span><span class="nb-shiki-140thh">); </span><span class="nb-shiki-21nrsd">// or .newUniqueId()</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(objectId); </span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Now: retrieve client to Durable Object directly via its name </span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">getByName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"foo"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Use client to send request to the remote Durable Object</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> rpcResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">sayHello</span><span class="nb-shiki-140thh">();</span></span></code></pre></figure> <p>Each Durable Object has a globally-unique name, which allows you to send requests to a specific object from anywhere in the world. Thus, a Durable Object can be used to coordinate between multiple clients who need to work together. You can have billions of Durable Objects, providing isolation between application tenants.</p> <p>To learn more, visit the Durable Objects <a href="https://developers.cloudflare.com/durable-objects/api/namespace/#getbyname">API Documentation</a> or the <a href="https://developers.cloudflare.com/durable-objects/get-started/">getting started guide</a>.</p>Thu, 21 Aug 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersGateway - Gateway BYOIP Dedicated Egress IPs now available.https://developers.cloudflare.com/changelog/post/2025-08-21-byoip-dedicated-egress-ip/https://developers.cloudflare.com/changelog/post/2025-08-21-byoip-dedicated-egress-ip/<p>Enterprise Gateway users can now use Bring Your Own IP (BYOIP) for dedicated egress IPs.</p> <p>Admins can now onboard and use their own IPv4 or IPv6 prefixes to egress traffic from Cloudflare, delivering greater control, flexibility, and compliance for network traffic.</p> <p>Get started by following the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/dedicated-egress-ips/#bring-your-own-ip-address-byoip">BYOIP onboarding process</a>. Once your IPs are onboarded, go to <strong>Gateway</strong> &gt; <strong>Egress policies</strong> and select or create an egress policy. In <strong>Select an egress IP</strong>, choose <em>Use dedicated egress IPs (Cloudflare or BYOIP)</em>, then select your BYOIP address from the dropdown menu.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=933,height=459,format=webp/_astro/Gateway-byoip-dedicated-egress-ips.D0pzLAbV.png" alt="Screenshot of a dropdown menu adding a BYOIP IPv4 address as a dedicated egress IP in a Gateway egress policy" loading="lazy" decoding="async" width="933" height="459"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/dedicated-egress-ips/#bring-your-own-ip-address-byoip">BYOIP for dedicated egress IPs</a>.</p>Thu, 21 Aug 2025 00:00:00 GMTGatewayGatewayCloudflare One Client - WARP client for Windows (version 2025.6.1335.0)https://developers.cloudflare.com/changelog/post/2025-08-19-warp-windows-ga/https://developers.cloudflare.com/changelog/post/2025-08-19-warp-windows-ga/<p>A new GA release for the Windows WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improvements to better manage multi-user pre-login registrations.</li> <li>Fixed an issue preventing devices from reaching split-tunneled traffic even when WARP was disconnected.</li> <li>Fix to prevent WARP from re-enabling its firewall rules after a user-initiated disconnect.</li> <li>Improvement for faster client connectivity on high-latency captive portal networks.</li> <li>Fixed an issue where recursive CNAME records could cause intermittent WARP connectivity issues.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li><p>For Windows 11 24H2 users, Microsoft has confirmed a regression that may lead to performance issues like mouse lag, audio cracking, or other slowdowns. Cloudflare recommends users experiencing these issues upgrade to a minimum <a href="https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd">Windows 11 24H2 version KB5062553</a> or higher for resolution.</p> </li> <li><p>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</p> </li> <li><p>Devices with KB5055523 installed may receive a warning about <code>Win32/ClickFix.ABA</code> being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to <a href="https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0">version 1.429.19.0</a> or later.</p> </li> <li><p>DNS resolution may be broken when the following conditions are all true:</p> <ul> <li>WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.</li> <li>A custom DNS server address is configured on the primary network adapter.</li> <li>The custom DNS server address on the primary network adapter is changed while WARP is connected.</li> </ul> <p>To work around this issue, reconnect the WARP client by toggling off and back on.</p> </li> </ul> Tue, 19 Aug 2025 22:10:43 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for macOS (version 2025.6.1335.0)https://developers.cloudflare.com/changelog/post/2025-08-19-warp-macos-ga/https://developers.cloudflare.com/changelog/post/2025-08-19-warp-macos-ga/<p>A new GA release for the macOS WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue preventing devices from reaching split-tunneled traffic even when WARP was disconnected.</li> <li>Fix to prevent WARP from re-enabling its firewall rules after a user-initiated disconnect.</li> <li>Improvement for faster client connectivity on high-latency captive portal networks.</li> <li>Fixed an issue where recursive CNAME records could cause intermittent WARP connectivity issues.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>macOS Sequoia: Due to changes Apple introduced in macOS 15.0.x, the WARP client may not behave as expected. Cloudflare recommends the use of macOS 15.4 or later.</li> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Tue, 19 Aug 2025 22:10:43 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - WARP client for Linux (version 2025.6.1335.0)https://developers.cloudflare.com/changelog/post/2025-08-19-warp-linux-ga/https://developers.cloudflare.com/changelog/post/2025-08-19-warp-linux-ga/<p>A new GA release for the Linux WARP client is now available on the <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/">stable releases downloads page</a>.</p> <p>This release contains minor fixes and improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Fixed an issue preventing devices from reaching split-tunneled traffic even when WARP was disconnected.</li> <li>Fix to prevent WARP from re-enabling its firewall rules after a user-initiated disconnect.</li> <li>Improvement for faster client connectivity on high-latency captive portal networks.</li> <li>Fixed an issue where recursive CNAME records could cause intermittent WARP connectivity issues.</li> </ul> <p><strong>Known issues</strong></p> <ul> <li>Devices using WARP client 2025.4.929.0 and up may experience Local Domain Fallback failures if a fallback server has not been configured. To configure a fallback server, refer to <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server">Route traffic to fallback server</a>.</li> </ul> Tue, 19 Aug 2025 19:45:33 GMTCloudflare One ClientCloudflare One ClientQueues - Subscribe to events from Cloudflare services with Queueshttps://developers.cloudflare.com/changelog/post/2025-08-19-event-subscriptions/https://developers.cloudflare.com/changelog/post/2025-08-19-event-subscriptions/<p>You can now subscribe to events from other Cloudflare services (for example, <a href="https://developers.cloudflare.com/kv/">Workers KV</a>, <a href="https://developers.cloudflare.com/workers-ai">Workers AI</a>, <a href="https://developers.cloudflare.com/workers">Workers</a>) and consume those events via <a href="https://developers.cloudflare.com/queues/">Queues</a>, allowing you to build custom workflows, integrations, and logic in response to account activity.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=924,height=403,format=webp/_astro/queues-event-subscriptions.3aVidnXJ.png" alt="Event subscriptions architecture" loading="lazy" decoding="async" width="924" height="403"> <p>Event subscriptions allow you to receive messages when events occur across your Cloudflare account. Cloudflare products can publish structured events to a queue, which you can then consume with <a href="https://developers.cloudflare.com/workers/">Workers</a> or <a href="https://developers.cloudflare.com/queues/configuration/pull-consumers/">pull via HTTP from anywhere</a>.</p> <p>To create a subscription, use the dashboard or <a href="https://developers.cloudflare.com/workers/wrangler/commands/queues/#queues-subscription-create">Wrangler</a>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> subscription</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-queue</span><span class="nb-shiki-dzsirb"> --source</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-dzsirb"> --events</span><span class="nb-shiki-mdbnqw"> bucket.created</span></span></code></pre></figure> <p>An event is a structured record of something happening in your Cloudflare account – like a Workers AI batch request being queued, a Worker build completing, or an R2 bucket being created. Events follow a consistent structure:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example R2 bucket created event</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf.r2.bucket.created"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "source"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"r2"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "payload"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "location"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"WNAM"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "metadata"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "accountId"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"f9f79265f388666de8122cfb508d7776"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "eventTimestamp"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-07-28T10:30:00Z"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Current <a href="https://developers.cloudflare.com/queues/event-subscriptions/events-schemas/">event sources</a> include <a href="https://developers.cloudflare.com/r2/">R2</a>, <a href="https://developers.cloudflare.com/kv/">Workers KV</a>, <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>, <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a>, <a href="https://developers.cloudflare.com/vectorize/">Vectorize</a>, <a href="https://developers.cloudflare.com/r2/data-migration/super-slurper/">Super Slurper</a>, and <a href="https://developers.cloudflare.com/workflows/">Workflows</a>. More sources and events are on the way.</p> <p>For more information on event subscriptions, available events, and how to get started, refer to our <a href="https://developers.cloudflare.com/queues/event-subscriptions/">documentation</a>.</p>Tue, 19 Aug 2025 12:00:00 GMTQueuesQueuesWorkers - Easier debugging in Workers with improved Wrangler error screenhttps://developers.cloudflare.com/changelog/post/2025-08-19-improved-wrangler-error-screen/https://developers.cloudflare.com/changelog/post/2025-08-19-improved-wrangler-error-screen/<p>Wrangler's error screen has received several improvements to enhance your debugging experience!</p> <p>The error screen now features a refreshed design thanks to <a href="https://www.npmjs.com/package/youch" target="_blank" rel="noopener">youch<span class="external-link"> ↗</span></a>, with support for both light and dark themes, improved source map resolution logic that handles missing source files more reliably, and better error cause display.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Before</th> <th>After (Light)</th> <th>After (Dark)</th> </tr> </thead> <tbody><tr><td><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=990,height=1500,format=webp/_astro/old-error-screen.yurLWiKb.png" alt="Old error screen" loading="lazy" decoding="async" width="990" height="1500"></td><td><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=990,height=1500,format=webp/_astro/new-error-screen-light.CcroERTP.png" alt="New light theme error screen" loading="lazy" decoding="async" width="990" height="1500"></td><td><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=990,height=1500,format=webp/_astro/new-error-screen-dark.BIDA2RGg.png" alt="New dark theme error screen" loading="lazy" decoding="async" width="990" height="1500"></td></tr></tbody></table></div> <p>Try it out now with <code>npx wrangler@latest dev</code> in your Workers project.</p>Tue, 19 Aug 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-08-18https://developers.cloudflare.com/changelog/post/2025-08-18-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-18-waf-release/ <p><strong>This week's update</strong></p> <p>This week, a series of critical vulnerabilities were discovered impacting core enterprise and open-source infrastructure. These flaws present a range of risks, providing attackers with distinct pathways for remote code execution, methods to breach internal network boundaries, and opportunities for critical data exposure and operational disruption.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>SonicWall SMA (CVE-2025-32819, CVE-2025-32820, CVE-2025-32821): A remote authenticated attacker with SSLVPN user privileges can bypass path traversal protections. These vulnerabilities enable a attacker to bypass security checks to read, modify, or delete arbitrary files. An attacker with administrative privileges can escalate this further, using a command injection flaw to upload malicious files, which could ultimately force the appliance to reboot to its factory default settings.</p> </li> <li> <p>Ms-Swift Project (CVE-2025-50460): An unsafe deserialization vulnerability exists in the Ms-Swift project's handling of YAML configuration files. If an attacker can control the content of a configuration file passed to the application, they can embed a malicious payload that will execute arbitrary code and it can be executed during deserialization.</p> </li> <li> <p>Apache Druid (CVE-2023-25194): This vulnerability in Apache Druid allows an attacker to cause the server to connect to a malicious LDAP server. By sending a specially crafted LDAP response, the attacker can trigger an unrestricted deserialization of untrusted data. If specific "gadgets" (classes that can be abused) are present in the server's classpath, this can be escalated to achieve Remote Code Execution (RCE).</p> </li> <li> <p>Tenda AC8v4 (CVE-2025-51087, CVE-2025-51088): Vulnerabilities allow an authenticated attacker to trigger a stack-based buffer overflow. By sending malformed arguments in a request to specific endpoints, an attacker can crash the device or potentially achieve arbitrary code execution.</p> </li> <li> <p>Open WebUI (CVE-2024-7959): This vulnerability allows a user to change the OpenAI URL endpoint to an arbitrary internal network address without proper validation. This flaw can be exploited to access internal services or cloud metadata endpoints, potentially leading to remote command execution if the attacker can retrieve instance secrets or access sensitive internal APIs.</p> </li> <li> <p>BentoML (CVE-2025-54381): The vulnerability exists in the serialization/deserialization handlers for multipart form data and JSON requests, which automatically download files from user-provided URLs without proper validation of internal network addresses. This allows attackers to fetch from unintended internal services, including cloud metadata and localhost.</p> </li> <li> <p>Adobe Experience Manager Forms (CVE-2025-54254): An Improper Restriction of XML External Entity Reference ('XXE') vulnerability that could lead to arbitrary file system read in Adobe AEM (≤6.5.23).</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities affect core infrastructure, from network security appliances like SonicWall to data platforms such as Apache Druid and ML frameworks like BentoML. The code execution and deserialization flaws are particularly severe, offering deep system access that allows attackers to steal data, disrupt services, and establish a foothold for broader intrusions. Simultaneously, SSRF and XXE vulnerabilities undermine network boundaries, exposing sensitive internal data and creating pathways for lateral movement. Beyond data-centric threats, flaws in edge devices like the Tenda router introduce the tangible risk of operational disruption, highlighting a multi-faceted threat to the security and stability of key enterprise systems.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="326ebb56d46a4c269bb699d3418d9a3b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...418d9a3b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100574</td><td>SonicWall SMA - Remote Code Execution - CVE:CVE-2025-32819, CVE:CVE-2025-32820, CVE:CVE-2025-32821</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="69f4f161dec04aca8a73a3231e6fefdb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1e6fefdb</span></button></rule-id></td><td>100576</td><td>Ms-Swift Project - Remote Code Execution - CVE:CVE-2025-50460</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d62935357ff846d9adefb58108ac45b3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...08ac45b3</span></button></rule-id></td><td>100585</td><td>Apache Druid - Remote Code Execution - CVE:CVE-2023-25194</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4f6148a760804bf8ad8ebccfe4855472"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e4855472</span></button></rule-id></td><td>100834</td><td>Tenda AC8v4 - Auth Bypass - CVE:CVE-2025-51087, CVE:CVE-2025-51088</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1474121b01ba40629f8246f8022ab542"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...022ab542</span></button></rule-id></td><td>100835</td><td>Open WebUI - SSRF - CVE:CVE-2024-7959</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="96abffdb7e224ce69ddf89eb6339f132"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6339f132</span></button></rule-id></td><td>100837</td><td>SQLi - OOB</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a0b20ec638d14800a1d6827cb83d2625"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b83d2625</span></button></rule-id></td><td>100841</td><td>BentoML - SSRF - CVE:CVE-2025-54381</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="40fd793035c947c5ac75add1739180d2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...739180d2</span></button></rule-id></td><td>100841A</td><td>BentoML - SSRF - CVE:CVE-2025-54381 - 2</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="08dcb20b9acf47e3880a0b886ab910c2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6ab910c2</span></button></rule-id></td><td>100841B</td><td>BentoML - SSRF - CVE:CVE-2025-54381 - 3</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="309cfb7eeb42482e9ad896f12197ec51"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2197ec51</span></button></rule-id></td><td>100845</td><td>Adobe Experience Manager Forms - XSS - CVE:CVE-2025-54254</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6e039776c2d6418ab6e8f05196f34ce3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...96f34ce3</span></button></rule-id></td><td>100845A</td><td>Adobe Experience Manager Forms - XSS - CVE:CVE-2025-54254 - 2</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 18 Aug 2025 00:00:00 GMTWAFWAFAccess - SFTP support for SSH with Cloudflare Access for Infrastructurehttps://developers.cloudflare.com/changelog/post/2025-08-15-sftp/https://developers.cloudflare.com/changelog/post/2025-08-15-sftp/<p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/">SSH with Cloudflare Access for Infrastructure</a> now supports SFTP. It is compatible with SFTP clients, such as Cyberduck.</p>Fri, 15 Aug 2025 00:00:00 GMTAccessAccessLoad Balancing - Steer Traffic by AS Number in Load Balancing Custom Ruleshttps://developers.cloudflare.com/changelog/post/2025-08-15-asnum-support-in-custom-rules/https://developers.cloudflare.com/changelog/post/2025-08-15-asnum-support-in-custom-rules/<p>You can now create more granular, network-aware Custom Rules in Cloudflare Load Balancing using the Autonomous System Number (ASN) of an incoming request.</p> <p>This allows you to steer traffic with greater precision based on the network source of a request. For example, you can route traffic from specific Internet Service Providers (ISPs) or enterprise customers to dedicated infrastructure, optimize performance, or enforce compliance by directing certain networks to preferred data centers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2554,height=1472,format=webp/_astro/asnum-custom-rule.CtcHu_zj.png" alt="Create a Load Balancing Custom Rule using AS Num" loading="lazy" decoding="async" width="2554" height="1472"> <p>To get started, create a <a href="https://developers.cloudflare.com/load-balancing/additional-options/load-balancing-rules/" target="_blank" rel="noopener">Custom Rule<span class="external-link"> ↗</span></a> in your Load Balancer and select <strong>AS Num</strong> from the <strong>Field</strong> dropdown.</p>Fri, 15 Aug 2025 00:00:00 GMTLoad BalancingLoad BalancingLog Explorer - Extended retentionhttps://developers.cloudflare.com/changelog/post/2025-08-15-extended-retention/https://developers.cloudflare.com/changelog/post/2025-08-15-extended-retention/<p>Customers can now rely on Log Explorer to meet their log retention compliance requirements.</p> <p>Contract customers can choose to store their logs in Log Explorer for up to two years, at an additional cost of $0.10 per GB per month. Customers interested in this feature can contact their account team to have it added to their contract.</p>Fri, 15 Aug 2025 00:00:00 GMTLog ExplorerLog ExplorerSecurity Center - Save time with bulk query creation in Brand Protectionhttps://developers.cloudflare.com/changelog/post/2025-08-15-brand-protection-bulk-endpoint/https://developers.cloudflare.com/changelog/post/2025-08-15-brand-protection-bulk-endpoint/<p><a href="https://developers.cloudflare.com/security-center/brand-protection/">Brand Protection</a> detects domains that may be impersonating your brand — from common misspellings (<code>cloudfalre.com</code>) to malicious concatenations (<code>cloudflare-okta.com</code>). Saved search queries run continuously and alert you when suspicious domains appear.</p> <p>You can now create and save multiple queries in a single step, streamlining setup and management. Available now via the <a href="https://developers.cloudflare.com/api/resources/brand_protection/subresources/queries/methods/bulk/">Brand Protection bulk query creation API</a>.</p>Fri, 15 Aug 2025 00:00:00 GMTSecurity CenterSecurity CenterCloudflare Fundamentals, Terraform - Terraform v5.8.4 now availablehttps://developers.cloudflare.com/changelog/post/2025-08-15-terraform-v5.8.4-provider/https://developers.cloudflare.com/changelog/post/2025-08-15-terraform-v5.8.4-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. We are aware of the high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by the Cloudflare Community related to the v5 release. We have committed to releasing improvements on a two week cadence to ensure stability and reliability.</p> <p>One key change we adopted in recent weeks is a pivot to more comprehensive, test-driven development. We are still evaluating individual issues, but are also investing in much deeper testing to drive our stabilization efforts. We will subsequently be investing in comprehensive migration scripts. As a result, you will see several of the highest traffic APIs have been stabilized in the most recent release, and are supported by comprehensive acceptance tests.</p> <p>Thank you for continuing to raise issues. We triage them weekly and they help make our products stronger.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Resources stabilized: <ul> <li><code>cloudflare_argo_smart_routing</code></li> <li><code>cloudflare_bot_management</code></li> <li><code>cloudflare_list</code></li> <li><code>cloudflare_list_item</code></li> <li><code>cloudflare_load_balancer</code></li> <li><code>cloudflare_load_balancer_monitor</code></li> <li><code>cloudflare_load_balancer_pool</code></li> <li><code>cloudflare_spectrum_application</code></li> <li><code>cloudflare_managed_transforms</code></li> <li><code>cloudflare_url_normalization_settings</code></li> <li><code>cloudflare_snippet</code></li> <li><code>cloudflare_snippet_rules</code></li> <li><code>cloudflare_zero_trust_access_application</code></li> <li><code>cloudflare_zero_trust_access_group</code></li> <li><code>cloudflare_zero_trust_access_identity_provider</code></li> <li><code>cloudflare_zero_trust_access_mtls_certificate</code></li> <li><code>cloudflare_zero_trust_access_mtls_hostname_settings</code></li> <li><code>cloudflare_zero_trust_access_policy</code></li> <li><code>cloudflare_zone</code></li> </ul> </li> <li>Multipart handling restored for <code>cloudflare_snippet</code></li> <li><code>cloudflare_bot_management</code> diff issues resolves when running <code>terraform plan</code> and <code>terraform apply</code></li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, refer to the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.8.4" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5017" target="_blank" rel="noopener">#5017: 'Uncaught Error: No such module' using cloudflare_snippets<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5701" target="_blank" rel="noopener">#5701: cloudflare_workers_script migrations for Durable Objects not recorded in tfstate; cannot be upgraded between versions<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5640" target="_blank" rel="noopener">#5640: cloudflare_argo_smart_routing importing doesn't read the actual value<span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new one if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest holding off on migration to v5 while we work on stabilization. This will help you avoid any blocking issues while the Terraform resources are actively being stabilized.</p> <p>If you'd like more information on migrating to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition. These migration scripts do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Fri, 15 Aug 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers - The Node.js and Web File System APIs in Workershttps://developers.cloudflare.com/changelog/post/2025-08-15-nodejs-fs/https://developers.cloudflare.com/changelog/post/2025-08-15-nodejs-fs/<p>Implementations of the <a href="https://nodejs.org/docs/latest/api/fs.html" target="_blank" rel="noopener"><code>node:fs</code> module<span class="external-link"> ↗</span></a> and the <a href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API" target="_blank" rel="noopener">Web File System API<span class="external-link"> ↗</span></a> are now available in Workers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="using-the-nodefs-module">Using the <code>node:fs</code> module</h4><a class="anchor-link" href="#using-the-nodefs-module"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>node:fs</code> module provides access to a virtual file system in Workers. You can use it to read and write files, create directories, and perform other file system operations.</p> <p>The virtual file system is ephemeral with each individual request havig its own isolated temporary file space. Files written to the file system will not persist across requests and will not be shared across requests or across different Workers.</p> <p>Workers running with the <code>nodejs_compat</code> compatibility flag will have access to the <code>node:fs</code> module by default when the compatibility date is set to <code>2025-09-01</code> or later. Support for the API can also be enabled using the <code>enable_nodejs_fs_module</code> compatibility flag together with the <code>nodejs_compat</code> flag. The <code>node:fs</code> module can be disabled using the <code>disable_nodejs_fs_module</code> compatibility flag.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> fs </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:fs"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> config</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">parse</span><span class="nb-shiki-140thh">(fs.</span><span class="nb-shiki-1t8gfj">readFileSync</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/bundle/config.json"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"utf-8"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Config value: ${</span><span class="nb-shiki-140thh">config</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">value</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>There are a number of initial limitations to the <code>node:fs</code> implementation:</p> <ul> <li>The glob APIs (e.g. <code>fs.globSync(...)</code>) are not implemented.</li> <li>The file watching APIs (e.g. <code>fs.watch(...)</code>) are not implemented.</li> <li>The file timestamps (modified time, access time, etc) are only partially supported. For now, these will always return the Unix epoch.</li> </ul> <p>Refer to the <a href="https://nodejs.org/docs/latest/api/fs.html" target="_blank" rel="noopener">Node.js documentation<span class="external-link"> ↗</span></a> for more information on the <code>node:fs</code> module and its APIs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="the-web-file-system-api">The Web File System API</h4><a class="anchor-link" href="#the-web-file-system-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The Web File System API provides access to the same virtual file system as the <code>node:fs</code> module, but with a different API surface. The Web File System API is only available in Workers running with the <code>enable_web_file_system</code> compatibility flag. The <code>nodejs_compat</code> compatibility flag is not required to use the Web File System API.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> root</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> navigator.storage.</span><span class="nb-shiki-1t8gfj">getDirectory</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> tmp</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> root.</span><span class="nb-shiki-1t8gfj">getDirectoryHandle</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/tmp"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> tmp.</span><span class="nb-shiki-1t8gfj">getFileHandle</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"data.txt"</span><span class="nb-shiki-140thh">, { create: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writable</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> file.</span><span class="nb-shiki-1t8gfj">createWritable</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> writable.</span><span class="nb-shiki-1t8gfj">getWriter</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Hello, World!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"File written successfully!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>As there are still some parts of the Web File System API that are not fully standardized, there may be some differences between the Workers implementation and the implementations in browsers.</p>Fri, 15 Aug 2025 00:00:00 GMTWorkersWorkersWorkers - Workers Static Assets: Corrected handling of double slashes in redirect rule pathshttps://developers.cloudflare.com/changelog/post/2025-08-15-static-assets-redirect-url/https://developers.cloudflare.com/changelog/post/2025-08-15-static-assets-redirect-url/<p><a href="https://developers.cloudflare.com/workers/static-assets/">Static Assets</a>: Fixed a bug in how <a href="https://developers.cloudflare.com/workers/static-assets/redirects/" target="_blank" rel="noopener">redirect rules<span class="external-link"> ↗</span></a> defined in your Worker's <code>_redirects</code> file are processed.</p> <p>If you're serving Static Assets with a <code>_redirects</code> file containing a rule like <code>/ja/* /:splat</code>, paths with double slashes were previously misinterpreted as external URLs. For example, visiting <code>/ja//example.com</code> would incorrectly redirect to <code>https://example.com</code> instead of <code>/example.com</code> on your domain. This has been fixed and double slashes now correctly resolve as local paths. Note: <a href="https://developers.cloudflare.com/pages/">Cloudflare Pages</a> was not affected by this issue.</p>Fri, 15 Aug 2025 00:00:00 GMTWorkersWorkersWorkers - Workers per-branch preview URLs now support long branch nameshttps://developers.cloudflare.com/changelog/post/2025-08-08-support-long-branch-names-preview-aliases/https://developers.cloudflare.com/changelog/post/2025-08-08-support-long-branch-names-preview-aliases/<p>We've updated <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">preview URLs</a> for Cloudflare Workers to support long branch names.</p> <p>Previously, branch and Worker names exceeding the 63-character DNS limit would cause alias generation to fail, leaving pull requests without aliased preview URLs. This particularly impacted teams relying on descriptive branch naming.</p> <p>Now, Cloudflare automatically truncates long branch names and appends a unique hash, ensuring every pull request gets a working preview link.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>63 characters or less</strong>: <code>&lt;branch-name&gt;-&lt;worker-name&gt;</code> → Uses actual branch name as is</li> <li><strong>64 characters or more</strong>: <code>&lt;truncated-branch-name&gt;--&lt;hash&gt;-&lt;worker-name&gt;</code> → Uses truncated name with 4-character hash</li> <li><strong>Hash generation</strong>: The hash is derived from the full branch name to ensure uniqueness</li> <li><strong>Stable URLs</strong>: The same branch always generates the same hash across all commits</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="requirements-and-compatibility">Requirements and compatibility</h4><a class="anchor-link" href="#requirements-and-compatibility"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Wrangler 4.30.0 or later</strong>: This feature requires updating to wrangler@4.30.0+</li> <li><strong>No configuration needed</strong>: Works automatically with existing preview URL setups</li> </ul>Thu, 14 Aug 2025 01:00:00 GMTWorkersWorkersAccess - Cloudflare Access Logging supports the Customer Metadata Boundary (CMB)https://developers.cloudflare.com/changelog/post/2025-07-01-Access-Supports-Customer-Metadata-Boundary/https://developers.cloudflare.com/changelog/post/2025-07-01-Access-Supports-Customer-Metadata-Boundary/<p>Cloudflare Access logs now support the <a href="https://developers.cloudflare.com/data-localization/metadata-boundary/">Customer Metadata Boundary (CMB)</a>. If you have configured the CMB for your account, all Access logging will respect that configuration.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>For EU CMB customers, the logs will not be stored by Access and will appear as empty in the dashboard. EU CMB customers should utilize <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a> to retain their Access logging, if desired.</p></div></div></aside>Thu, 14 Aug 2025 00:00:00 GMTAccessAccessWorkers - Python Workers handlers now live in an entrypoint classhttps://developers.cloudflare.com/changelog/post/2025-08-14-new-python-handlers/https://developers.cloudflare.com/changelog/post/2025-08-14-new-python-handlers/ <p>We are changing how Python Workers are structured by default. Previously, handlers were defined at the top-level of a module as <code>on_fetch</code>, <code>on_scheduled</code>, etc. methods, but now they live in an entrypoint class.</p> <p>Here's an example of how to now define a Worker with a fetch handler:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Response, WorkerEntrypoint</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> Default</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkerEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(self, request):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response(</span><span class="nb-shiki-mdbnqw">"Hello World!"</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>To keep using the old-style handlers, you can specify the <code>disable_python_no_global_handlers</code> compatibility flag in your wrangler file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_flags"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "disable_python_no_global_handlers"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">compatibility_flags = [ </span><span class="nb-shiki-mdbnqw">"disable_python_no_global_handlers"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Consult the <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers documentation</a> for more details.</p>Thu, 14 Aug 2025 00:00:00 GMTWorkersWorkersWorkers - Terraform provider improvements — Python Workers support, smaller plan diffs, and API SDK fixeshttps://developers.cloudflare.com/changelog/post/2025-08-14-workers-terraform-and-sdk-improvements/https://developers.cloudflare.com/changelog/post/2025-08-14-workers-terraform-and-sdk-improvements/<p>The recent <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script" target="_blank" rel="noopener">Cloudflare Terraform Provider<span class="external-link"> ↗</span></a> and SDK releases (such as <a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener">cloudflare-typescript<span class="external-link"> ↗</span></a>) bring significant improvements to the Workers developer experience. These updates focus on reliability, performance, and adding <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers</a> support.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="terraform-improvements">Terraform Improvements</h4><a class="anchor-link" href="#terraform-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="fixed-unwarranted-plan-diffs">Fixed Unwarranted Plan Diffs</h4><a class="anchor-link" href="#fixed-unwarranted-plan-diffs"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Resolved several issues with the <code>cloudflare_workers_script</code> resource that resulted in unwarranted plan diffs, including:</p> <ul> <li>Using Durable Objects migrations</li> <li>Using some bindings such as <code>secret_text</code></li> <li>Using smart placement</li> </ul> <p>A resource should never show a plan diff if there isn't an actual change. This fix reduces unnecessary noise in your Terraform plan and is available in Cloudflare Terraform Provider 5.8.0.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-file-management">Improved File Management</h4><a class="anchor-link" href="#improved-file-management"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can now specify <code>content_file</code> and <code>content_sha256</code> instead of <code>content</code>. This prevents the Workers script content from being stored in the state file which greatly reduces plan diff size and noise. If your workflow synced plans remotely, this should now happen much faster since there is less data to sync. This is available in Cloudflare Terraform Provider 5.7.0.</p> <figure class="nb-code-figure" data-nb-lang="tf"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tf" data-nb-lang="tf"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_script"</span><span class="nb-shiki-dzsirb"> "my_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "123456789"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_worker"</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "worker.mjs"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "worker.mjs"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_sha256</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> filesha256</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"worker.mjs"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="assets-headers-and-redirects-support">Assets Headers and Redirects Support</h4><a class="anchor-link" href="#assets-headers-and-redirects-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Fixed the <code>cloudflare_workers_script</code> resource to properly support headers and redirects for Assets:</p> <figure class="nb-code-figure" data-nb-lang="tf"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tf" data-nb-lang="tf"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_script"</span><span class="nb-shiki-dzsirb"> "my_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "123456789"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_worker"</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "worker.mjs"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "worker.mjs"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_sha256</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> filesha256</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"worker.mjs"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> assets</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> config </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> file</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"_headers"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> redirects </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> file</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"_redirects"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-21nrsd"> # Completion jwt from:</span></span> <span class="line"><span class="nb-shiki-21nrsd"> # https://developers.cloudflare.com/api/resources/workers/subresources/assets/subresources/upload/</span></span> <span class="line"><span class="nb-shiki-140thh"> jwt </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw"> "jwt"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Available in Cloudflare Terraform Provider 5.8.0.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="python-workers-support">Python Workers Support</h4><a class="anchor-link" href="#python-workers-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Added support for uploading <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers</a> (beta) in Terraform. You can now deploy Python Workers with:</p> <figure class="nb-code-figure" data-nb-lang="tf"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tf" data-nb-lang="tf"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_workers_script"</span><span class="nb-shiki-dzsirb"> "my_worker"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "123456789"</span></span> <span class="line"><span class="nb-shiki-140thh"> script_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_worker"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_file</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "worker.py"</span></span> <span class="line"><span class="nb-shiki-140thh"> content_sha256</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> filesha256</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"worker.py"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> content_type</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "text/x-python"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Available in Cloudflare Terraform Provider 5.8.0.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="sdk-enhancements">SDK Enhancements</h4><a class="anchor-link" href="#sdk-enhancements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-file-upload-api">Improved File Upload API</h4><a class="anchor-link" href="#improved-file-upload-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Fixed an issue where Workers script versions in the SDK did not allow uploading files. This now works, and also has an improved files upload interface:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> scriptContent</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> `</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> export default {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> async fetch(request, env, ctx) {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> return new Response('Hello World!', { status: 200 });</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> };</span></span> <span class="line"><span class="nb-shiki-mdbnqw">`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">client.workers.scripts.versions.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'my-worker'</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: </span><span class="nb-shiki-mdbnqw">'123456789'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> metadata: {</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module: </span><span class="nb-shiki-mdbnqw">'my-worker.mjs'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> files: [</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> toFile</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> Buffer.</span><span class="nb-shiki-1t8gfj">from</span><span class="nb-shiki-140thh">(scriptContent),</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> 'my-worker.mjs'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"application/javascript+module"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> )</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Will be available in cloudflare-typescript 4.6.0. A similar change will be available in cloudflare-python 4.4.0.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="fixed-updating-kv-values">Fixed updating KV values</h4><a class="anchor-link" href="#fixed-updating-kv-values"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously when creating a KV value like this:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> cf.kv.namespaces.values.</span><span class="nb-shiki-1t8gfj">update</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-kv-namespace"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"key1"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: </span><span class="nb-shiki-mdbnqw">"123456789"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> metadata: </span><span class="nb-shiki-mdbnqw">"my metadata"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> value: </span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> hello: </span><span class="nb-shiki-mdbnqw">"world"</span></span> <span class="line"><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>...and recalling it in your Worker like this:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> c.env.</span><span class="nb-shiki-dzsirb">KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">&lt;{</span><span class="nb-shiki-1jdh33">hello</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">}&gt;(</span><span class="nb-shiki-mdbnqw">"key1"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"json"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>You'd get back this: <code>{metadata:'my metadata', value:"{'hello':'world'}"}</code> instead of the correct value of <code>{hello: 'world'}</code></p> <p>This is fixed in cloudflare-typescript 4.5.0 and will be fixed in cloudflare-python 4.4.0.</p>Thu, 14 Aug 2025 00:00:00 GMTWorkersWorkersLogs - IBM Cloud Logs as Logpush destinationhttps://developers.cloudflare.com/changelog/post/2025-08-13-ibm-cloud-logs-destination/https://developers.cloudflare.com/changelog/post/2025-08-13-ibm-cloud-logs-destination/<p>Cloudflare Logpush now supports IBM Cloud Logs as a native destination.</p> <p>Logs from Cloudflare can be sent to <a href="https://www.ibm.com/products/cloud-logs" target="_blank" rel="noopener">IBM Cloud Logs<span class="external-link"> ↗</span></a> via <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a>. The setup can be done through the Logpush UI in the Cloudflare Dashboard or by using the <a href="https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/">Logpush API</a>. The integration requires IBM Cloud Logs HTTP Source Address and an IBM API Key. The feature also allows for filtering events and selecting specific log fields.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/ibm-cloud-logs/">Destination Configuration</a> documentation.</p>Wed, 13 Aug 2025 00:00:00 GMTLogsLogsWorkers - MessageChannel and MessagePorthttps://developers.cloudflare.com/changelog/post/2025-08-11-messagechannel/https://developers.cloudflare.com/changelog/post/2025-08-11-messagechannel/<p>A minimal implementation of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel" target="_blank" rel="noopener">MessageChannel API<span class="external-link"> ↗</span></a> is now available in Workers. This means that you can use <code>MessageChannel</code> to send messages between different parts of your Worker, but not across different Workers.</p> <p>The <code>MessageChannel</code> and <code>MessagePort</code> APIs will be available by default at the global scope with any worker using a compatibility date of <code>2025-08-15</code> or later. It is also available using the <code>expose_global_message_channel</code> compatibility flag, or can be explicitly disabled using the <code>no_expose_global_message_channel</code> compatibility flag.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">port1</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">port2</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> MessageChannel</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">port2.</span><span class="nb-shiki-1t8gfj">onmessage</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Received message:'</span><span class="nb-shiki-140thh">, event.data);</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">port2.</span><span class="nb-shiki-1t8gfj">postMessage</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Hello from port2!'</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Any value that can be used with the <code>structuredClone(...)</code> API can be sent over the port.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="differences">Differences</h4><a class="anchor-link" href="#differences"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>There are a number of key limitations to the <code>MessageChannel</code> API in Workers:</p> <ul> <li>Transfer lists are currently not supported. This means that you will not be able to transfer ownership of objects like <code>ArrayBuffer</code> or <code>MessagePort</code> between ports.</li> <li>The <code>MessagePort</code> is not yet serializable. This means that you cannot send a <code>MessagePort</code> object through the <code>postMessage</code> method or via JSRPC calls.</li> <li>The <code>'messageerror'</code> event is only partially supported. If the <code>'onmessage'</code> handler throws an error, the <code>'messageerror'</code> event will be triggered, however, it will not be triggered when there are errors serializing or deserializing the message data. Instead, the error will be thrown when the <code>postMessage</code> method is called on the sending port.</li> <li>The <code>'close'</code> event will be emitted on both ports when one of the ports is closed, however it will not be emitted when the Worker is terminated or when one of the ports is garbage collected.</li> </ul>Mon, 11 Aug 2025 01:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-08-11https://developers.cloudflare.com/changelog/post/2025-08-11-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-11-waf-release/ <p>This week's update focuses on a wide range of enterprise software, from network infrastructure and security platforms to content management systems and development frameworks. Flaws include unsafe deserialization, OS command injection, SSRF, authentication bypass, and arbitrary file upload — many of which allow unauthenticated remote code execution. Notable risks include Cisco Identity Services Engine and Ivanti EPMM, where successful exploitation could grant attackers full administrative control of core network infrastructure and popular web services such as WordPress, SharePoint, and Ingress-Nginx, where security bypasses and arbitrary file uploads could lead to complete site or server compromise.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Cisco Identity Services Engine (CVE-2025-20281): Insufficient input validation in a specific API of Cisco Identity Services Engine (ISE) and ISE-PIC allows an unauthenticated, remote attacker to execute arbitrary code with root privileges on an affected device.</p> </li> <li> <p>Wazuh Server (CVE-2025-24016): An unsafe deserialization vulnerability in Wazuh Server (versions 4.4.0 to 4.9.0) allows for remote code execution and privilege escalation. By injecting unsanitized data, an attacker can trigger an exception to execute arbitrary code on the server.</p> </li> <li> <p>CrushFTP (CVE-2025-54309): A flaw in AS2 validation within CrushFTP allows remote attackers to gain administrative access via HTTPS on systems not using the DMZ proxy feature. This flaw can lead to unauthorized file access and potential system compromise.</p> </li> <li> <p>Kentico Xperience CMS (CVE-2025-2747, CVE-2025-2748): Vulnerabilities in Kentico Xperience CMS could enable cross-site scripting (XSS), allowing attackers to inject malicious scripts into web pages. Additionally, a flaw could allow unauthenticated attackers to bypass the Staging Sync Server's authentication, potentially leading to administrative control over the CMS.</p> </li> <li> <p>Node.js (CVE-2025-27210): An incomplete fix for a previous vulnerability (CVE-2025-23084) in Node.js affects the <code>path.join()</code> API method on Windows systems. The vulnerability can be triggered using reserved Windows device names such as <code>CON</code>, <code>PRN</code>, or <code>AUX</code>.</p> </li> <li> <p>WordPress:Plugin:Simple File List (CVE-2025-34085, CVE-2020-36847): This vulnerability in the Simple File List plugin for WordPress allows an unauthenticated remote attacker to upload arbitrary files to a vulnerable site. This can be exploited to achieve remote code execution on the server.<br> (Note: CVE-2025-34085 has been rejected as a duplicate.)</p> </li> <li> <p>GeoServer (CVE-2024-29198): A Server-Side Request Forgery (SSRF) vulnerability exists in GeoServer's Demo request endpoint, which can be exploited where the Proxy Base URL has not been configured.</p> </li> <li> <p>Ivanti EPMM (CVE-2025-6771): An OS command injection vulnerability in Ivanti Endpoint Manager Mobile (EPMM) before versions 12.5.0.2, 12.4.0.3, and 12.3.0.3 allows a remote, authenticated attacker with high privileges to execute arbitrary code.</p> </li> <li> <p>Microsoft SharePoint (CVE-2024-38018): This is a remote code execution vulnerability affecting Microsoft SharePoint Server.</p> </li> <li> <p>Manager-IO (CVE-2025-54122): A critical unauthenticated full read Server-Side Request Forgery (SSRF) vulnerability is present in the proxy handler of both Manager Desktop and Server editions up to version 25.7.18.2519. This allows an unauthenticated attacker to bypass network isolation and access internal services.</p> </li> <li> <p>Ingress-Nginx (CVE-2025-1974): A vulnerability in the Ingress-Nginx controller for Kubernetes allows an attacker to bypass access control rules. An unauthenticated attacker with access to the pod network can achieve arbitrary code execution in the context of the ingress-nginx controller.</p> </li> <li> <p>PaperCut NG/MF (CVE-2023-2533): A Cross-Site Request Forgery (CSRF) vulnerability has been identified in PaperCut NG/MF. Under specific conditions, an attacker could exploit this to alter security settings or execute arbitrary code if they can deceive an administrator with an active login session into clicking a malicious link.</p> </li> <li> <p>SonicWall SMA (CVE-2025-40598): This vulnerability could allow an unauthenticated attacker to bypass security controls. This allows a remote, unauthenticated attacker to potentially execute arbitrary JavaScript code.</p> </li> <li> <p>WordPress (CVE-2025-5394): The "Alone – Charity Multipurpose Non-profit WordPress Theme" for WordPress is vulnerable to arbitrary file uploads. A missing capability check allows unauthenticated attackers to upload ZIP files containing webshells disguised as plugins, leading to remote code execution.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities span a broad range of enterprise technologies, including network access control systems, monitoring platforms, web servers, CMS platforms, cloud services, and collaboration tools. Exploitation techniques range from remote code execution and command injection to authentication bypass, SQL injection, path traversal, and configuration weaknesses.</p> <p>A critical flaw in perimeter devices like Ivanti EPMM or SonicWall SMA could allow an unauthenticated attacker to gain remote code execution, completely breaching the primary network defense. A separate vulnerability within Cisco's Identity Services Engine could then be exploited to bypass network segmentation, granting an attacker widespread internal access. Insecure deserialization issues in platforms like Wazuh Server and CrushFTP could then be used to run malicious payloads or steal sensitive files from administrative consoles. Weaknesses in web delivery controllers like Ingress-Nginx or popular content management systems such as WordPress, SharePoint, and Kentico Xperience create vectors to bypass security controls, exfiltrate confidential data, or fully compromise servers.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ec6480c81253494b947d891e51bc8df1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...51bc8df1</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100538</td><td>GeoServer - SSRF - CVE:CVE-2024-29198</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b8cb07170b5e4c2b989119cac9e0b290"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c9e0b290</span></button></rule-id></td><td>100548</td><td>Ivanti EPMM - Remote Code Execution - CVE:CVE-2025-6771</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b3524bf5f5174b65bc892122ad93cda8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ad93cda8</span></button></rule-id></td><td>100550</td><td>Microsoft SharePoint - Remote Code Execution - CVE:CVE-2024-38018</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e1369c5d629f4f10a14141381dca5738"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1dca5738</span></button></rule-id></td><td>100562</td><td>Manager-IO - SSRF - CVE:CVE-2025-54122</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="136f67e2b6a84f15ab9a82a52e9137e1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2e9137e1</span></button></rule-id></td><td>100565</td><td><p>Cisco Identity Services Engine - Remote Code Execution - CVE:CVE-2025-20281</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ed759f7e44184fa398ef71785d8102e1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5d8102e1</span></button></rule-id></td><td>100567</td><td>Ingress-Nginx - Remote Code Execution - CVE:CVE-2025-1974</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="71b8e7b646f94d79873213cd99105c43"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...99105c43</span></button></rule-id></td><td>100569</td><td>PaperCut NG/MF - Remote Code Execution - CVE:CVE-2023-2533</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2450bfbb0cfb4804b109d1c42c81dc88"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2c81dc88</span></button></rule-id></td><td>100571</td><td>SonicWall SMA - XSS - CVE:CVE-2025-40598</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8ce1903b67e24205a93f5fe6926c96d4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...926c96d4</span></button></rule-id></td><td>100573</td><td>WordPress - Dangerous File Upload - CVE:CVE-2025-5394</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7fdb3c7bc7b74703aeef4ab240ec2fda"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...40ec2fda</span></button></rule-id></td><p><td>100806</td><br> <td>Wazuh Server - Remote Code Execution - CVE:CVE-2025-24016</td> <td>Log</td> <td>Block</td> <td>This is a New Detection</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fe088163f51f4928a3c8d91e2401fa3b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2401fa3b</span></button></rule-id></td><p><td>100824</td> <td>CrushFTP - Remote Code Execution - CVE:CVE-2025-54309</td> <td>Log</td> <td>Block</td><br> <td>This is a New Detection</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3638baed75924604987b86d874920ace"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...74920ace</span></button></rule-id></td><p><td>100824A</td> <td>CrushFTP - Remote Code Execution - CVE:CVE-2025-54309 - 2</td> <td>Log</td> <td>Block</td><br> <td>This is a New Detection</td></p></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="dda4f95b3a3e4ebb9e194aa5c7e63549"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c7e63549</span></button></rule-id></td><td>100825</td><td>AMI MegaRAC - Auth Bypass - CVE:CVE-2024-54085</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7dc07014cefa4ce9adf21da7b79037e6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b79037e6</span></button></rule-id></td><td>100826</td><td>Kentico Xperience CMS - Auth Bypass - CVE:CVE-2025-2747</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7c7a0a37e79a4949ba840c9acaf261aa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...caf261aa</span></button></rule-id></td><td>100827</td><td>Kentico Xperience CMS - XSS - CVE:CVE-2025-2748</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54dd826f578c483196ce852b6f1c2d12"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6f1c2d12</span></button></rule-id></td><td>100828</td><td>Node.js - Directory Traversal - CVE:CVE-2025-27210</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a2867f7456c14213a94509a40341fccc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0341fccc</span></button></rule-id></td><td>100829</td><td><p>WordPress:Plugin:Simple File List - Remote Code Execution - CVE:CVE-2025-34085</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4cdb0e792d1a428a897526624cefeeda"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4cefeeda</span></button></rule-id></td><td>100829A</td><td><p>WordPress:Plugin:Simple File List - Remote Code Execution - CVE:CVE-2025-34085 - 2</p></td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 11 Aug 2025 00:00:00 GMTWAFWAFWorkers - Wrangler and the Cloudflare Vite plugin support `.env` files in local developmenthttps://developers.cloudflare.com/changelog/post/2025-08-08-dot-env-in-local-dev/https://developers.cloudflare.com/changelog/post/2025-08-08-dot-env-in-local-dev/<p>Now, you can use <code>.env</code> files to provide secrets and override environment variables on the <code>env</code> object during local development with Wrangler and the Cloudflare Vite plugin.</p> <p>Previously in local development, if you wanted to provide secrets or environment variables during local development, you had to use <code>.dev.vars</code> files. This is still supported, but you can now also use <code>.env</code> files, which are more familiar to many developers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="using-env-files-in-local-development">Using <code>.env</code> files in local development</h4><a class="anchor-link" href="#using-env-files-in-local-development"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can create a <code>.env</code> file in your project root to define environment variables that will be used when running <code>wrangler dev</code> or <code>vite dev</code>. The <code>.env</code> file should be formatted like a <code>dotenv</code> file, such as <code>KEY="VALUE"</code>:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">.env</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-140thh">TITLE</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"My Worker"</span></span> <span class="line"><span class="nb-shiki-140thh">API_TOKEN</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"dev-token"</span></span></code></pre></figure> <p>When you run <code>wrangler dev</code> or <code>vite dev</code>, the environment variables defined in the <code>.env</code> file will be available in your Worker code via the <code>env</code> object:</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> title</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">TITLE</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// "My Worker"</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> apiToken</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">API_TOKEN</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// "dev-token"</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `https://api.example.com/data?token=${</span><span class="nb-shiki-140thh">apiToken</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Title: ${</span><span class="nb-shiki-140thh">title</span><span class="nb-shiki-mdbnqw">} - `</span><span class="nb-shiki-1itgoe"> +</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">text</span><span class="nb-shiki-140thh">()));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="multiple-environments-with-env-files">Multiple environments with <code>.env</code> files</h4><a class="anchor-link" href="#multiple-environments-with-env-files"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If your Worker defines multiple <a href="https://developers.cloudflare.com/workers/wrangler/environments/">environments</a>, you can set different variables for each environment (ex: production or staging) by creating files named <code>.env.&lt;environment-name&gt;</code>.</p> <p>When you use <code>wrangler &lt;command&gt; --env &lt;environment-name&gt;</code> or <code>CLOUDFLARE_ENV=&lt;environment-name&gt; vite dev</code>, the corresponding environment-specific file will also be loaded and merged with the <code>.env</code> file.</p> <p>For example, if you want to set different environment variables for the <code>staging</code> environment, you can create a file named <code>.env.staging</code>:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">.env.staging</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-140thh">API_TOKEN</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"staging-token"</span></span></code></pre></figure> <p>When you run <code>wrangler dev --env staging</code> or <code>CLOUDFLARE_ENV=staging vite dev</code>, the environment variables from <code>.env.staging</code> will be merged onto those from <code>.env</code>.</p> <figure class="nb-code-figure" data-nb-lang="javascript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> title</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">TITLE</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// "My Worker" (from `.env`)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> apiToken</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">API_TOKEN</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// "staging-token" (from `.env.staging`, overriding the value from `.env`)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `https://api.example.com/data?token=${</span><span class="nb-shiki-140thh">apiToken</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Title: ${</span><span class="nb-shiki-140thh">title</span><span class="nb-shiki-mdbnqw">} - `</span><span class="nb-shiki-1itgoe"> +</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">text</span><span class="nb-shiki-140thh">()));</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="find-out-more">Find out more</h4><a class="anchor-link" href="#find-out-more"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For more information on how to use <code>.env</code> files with Wrangler and the Cloudflare Vite plugin, see the following documentation:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/local-development/environment-variables">Environment variables and secrets</a></li> <li><a href="https://developers.cloudflare.com/workers/wrangler" target="_blank" rel="noopener">Wrangler Documentation<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/workers/wrangler/vite" target="_blank" rel="noopener">Cloudflare Vite Plugin Documentation<span class="external-link"> ↗</span></a></li> </ul>Fri, 08 Aug 2025 01:00:00 GMTWorkersWorkersStream - Introducing observability and metrics for Stream Live Inputshttps://developers.cloudflare.com/changelog/post/2025-08-08-stream-live-observability/https://developers.cloudflare.com/changelog/post/2025-08-08-stream-live-observability/<p>New information about broadcast metrics and events is now available in <a href="https://developers.cloudflare.com/stream/">Cloudflare Stream</a> in the Live Input details of the Dashboard.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1382,height=907,format=webp/_astro/2025-08-05-live-input-metrics.B31Z3RGB.png" alt="Live Input details showing metrics" loading="lazy" decoding="async" width="1382" height="907"> <p>You can now easily understand broadcast-side health and performance with new observability, which can help when troubleshooting common issues, particularly for new customers who are just getting started, and platform customers who may have limited visibility into how their end-users configure their encoders.</p> <p>To get started, start a live stream (<a href="https://developers.cloudflare.com/stream/examples/obs-from-scratch/">just getting started?</a>), then visit the Live Input details page in Dash.</p> <p>See our new live <a href="https://developers.cloudflare.com/stream/stream-live/troubleshooting/">Troubleshooting</a> guide to learn what these metrics mean and how to use them to address common broadcast issues.</p>Fri, 08 Aug 2025 00:00:00 GMTStreamStreamWorkers - Directly import `waitUntil` in Workers for easily spawning background taskshttps://developers.cloudflare.com/changelog/post/2025-08-08-add-waituntil-cloudflare-workers/https://developers.cloudflare.com/changelog/post/2025-08-08-add-waituntil-cloudflare-workers/<p>You can now import <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil"><code>waitUntil</code></a> from <code>cloudflare:workers</code> to extend your Worker's execution beyond the request lifecycle from anywhere in your code.</p> <p>Previously, <code>waitUntil</code> could only be accessed through the <a href="https://developers.cloudflare.com/workers/runtime-apis/context/">execution context</a> (<code>ctx</code>) parameter passed to your Worker's handler functions. This meant that if you needed to schedule background tasks from deeply nested functions or utility modules, you had to pass the <code>ctx</code> object through multiple function calls to access <code>waitUntil</code>.</p> <p>Now, you can import <code>waitUntil</code> directly and use it anywhere in your Worker without needing to pass <code>ctx</code> as a parameter:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { waitUntil } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> trackAnalytics</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">eventData</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> analyticsPromise</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://analytics.example.com/track"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> method: </span><span class="nb-shiki-mdbnqw">"POST"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> body: </span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">(eventData),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Extend execution to ensure analytics tracking completes</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> waitUntil</span><span class="nb-shiki-140thh">(analyticsPromise);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>This is particularly useful when you want to:</p> <ul> <li>Schedule background tasks from utility functions or modules</li> <li>Extend execution for analytics, logging, or cleanup operations</li> <li>Avoid passing the execution context through multiple layers of function calls</li> </ul> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { waitUntil } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Background task that should complete even after response is sent</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> cleanupTempData</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">KV_NAMESPACE</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Hello, World!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> cleanupTempData</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">kvNamespace</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // This function can now use waitUntil without needing ctx</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> deletePromise</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> kvNamespace.</span><span class="nb-shiki-1t8gfj">delete</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"temp-key"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> waitUntil</span><span class="nb-shiki-140thh">(deletePromise);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>The imported <code>waitUntil</code> function works the same way as <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil"><code>ctx.waitUntil()</code></a>. It extends your Worker's execution to wait for the provided promise to settle, but does not block the response from being sent to the client.</p></div></div></aside> <p>For more information, see the <a href="https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil"><code>waitUntil</code> documentation</a>.</p>Fri, 08 Aug 2025 00:00:00 GMTWorkersWorkersEmail security - Expanded Email Link Isolationhttps://developers.cloudflare.com/changelog/post/2025-08-07-expanded-link-isolation/https://developers.cloudflare.com/changelog/post/2025-08-07-expanded-link-isolation/<p>When you deploy MX or Inline, not only can you apply email link isolation to suspicious links in all emails (including benign), you can now also apply email link isolation to all links of a specified disposition. This provides more flexibility in controlling user actions within emails.</p> <p>For example, you may want to deliver suspicious messages but isolate the links found within them so that users who choose to interact with the links will not accidentally expose your organization to threats. This means your end users are more secure than ever before.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=497,format=webp/_astro/expanded-link-actions.DziIg6E8.jpg" alt="Expanded Email Link Isolation Configuration" loading="lazy" decoding="async" width="1600" height="497"> <p>To isolate all links within a message based on the disposition, select <strong>Settings</strong> &gt; <strong>Link Actions</strong> &gt; <strong>View</strong> and select <strong>Configure</strong>. As with other other links you isolate, an interstitial will be provided to warn users that this site has been isolated and the link will be recrawled live to evaluate if there are any changes in our threat intel. Learn more about this feature on <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/configure-link-actions/" target="_blank" rel="noopener">Configure link actions<span class="external-link"> ↗</span></a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 07 Aug 2025 23:22:49 GMTEmail securityEmail securityWAF - WAF Release - 2025-08-07 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-08-07-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-07-emergency-waf-release/ <p>This week’s highlight focuses on two critical vulnerabilities affecting key infrastructure and enterprise content management platforms. Both flaws present significant remote code execution risks that can be exploited with minimal or no user interaction.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Squid (≤6.3) — CVE-2025-54574: A heap buffer overflow occurs when processing Uniform Resource Names (URNs). This vulnerability may allow remote attackers to execute arbitrary code on the server. The issue has been resolved in version 6.4.</p> </li> <li> <p>Adobe AEM (≤6.5.23) — CVE-2025-54253: Due to a misconfiguration, attackers can achieve remote code execution without requiring any user interaction, posing a severe threat to affected deployments.</p> </li> </ul> <p><strong>Impact</strong></p> <p>Both vulnerabilities expose critical attack vectors that can lead to full server compromise. The Squid heap buffer overflow allows remote code execution by crafting malicious URNs, which can lead to server takeover or denial of service. Given Squid’s widespread use as a caching proxy, this flaw could be exploited to disrupt network traffic or gain footholds inside secure environments.</p> <p>Adobe AEM’s remote code execution vulnerability enables attackers to run arbitrary code on the content management server without any user involvement. This puts sensitive content, application integrity, and the underlying infrastructure at extreme risk. Exploitation could lead to data theft, defacement, or persistent backdoor installation.</p> <p>These findings reinforce the urgency of updating to the patched versions — Squid 6.4 and Adobe AEM 6.5.24 or later — and reviewing configurations to prevent exploitation.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f61ed7c1e7e24c3380289e41ef7e015b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ef7e015b</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100844</td><td>Adobe Experience Manager Forms - Remote Code Execution - CVE:CVE-2025-54253</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e76e65f5a3aa43f49e0684a6baec057a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...baec057a</span></button></rule-id></td><td>100840</td><td>Squid - Buffer Overflow - CVE:CVE-2025-54574</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Thu, 07 Aug 2025 00:00:00 GMTWAFWAFWorkers - Requests made from Cloudflare Workers can now force a revalidation of their cache with the originhttps://developers.cloudflare.com/changelog/post/2025-08-07-cache-no-cache/https://developers.cloudflare.com/changelog/post/2025-08-07-cache-no-cache/ <p>By setting the value of the <code>cache</code> property to <code>no-cache</code>, you can force <a href="https://developers.cloudflare.com/workers/reference/how-the-cache-works/">Cloudflare's cache</a> to revalidate its contents with the origin when making subrequests from <a href="https://developers.cloudflare.com/workers">Cloudflare Workers</a>.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> request</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://cloudflare.com"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: </span><span class="nb-shiki-mdbnqw">"no-cache"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> request</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://cloudflare.com"</span><span class="nb-shiki-140thh">, { cache: </span><span class="nb-shiki-mdbnqw">'no-cache'</span><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Environment</span><span class="nb-shiki-140thh">></span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>When <code>no-cache</code> is set, the Worker request will first look for a match in Cloudflare's cache, then:</p> <ul> <li>If there is a match, a conditional request is sent to the origin, regardless of whether or not the match is fresh or stale. If the resource has not changed, the cached version is returned. If the resource has changed, it will be downloaded from the origin, updated in the cache, and returned.</li> <li>If there is no match, Workers will make a standard request to the origin and cache the response.</li> </ul> <p>This increases compatibility with NPM packages and JavaScript frameworks that rely on setting the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#options"><code>cache</code></a> property, which is a cross-platform standard part of the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/"><code>Request</code></a> interface. Previously, if you set the <code>cache</code> property on <code>Request</code> to <code>'no-cache'</code>, the Workers runtime threw an exception.</p> <ul> <li>Learn <a href="https://developers.cloudflare.com/workers/reference/how-the-cache-works/">how the Cache works with Cloudflare Workers</a></li> <li>Enable <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/">Node.js compatibility</a> for your Cloudflare Worker</li> <li>Explore <a href="https://developers.cloudflare.com/workers/runtime-apis/">Runtime APIs</a> and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">Bindings</a> available in Cloudflare Workers</li> </ul>Thu, 07 Aug 2025 00:00:00 GMTWorkersWorkersLoad Balancing - Improvements to Monitoring Using Zone Settingshttps://developers.cloudflare.com/changelog/post/2025-08-06-zone-monitoring-improvements/https://developers.cloudflare.com/changelog/post/2025-08-06-zone-monitoring-improvements/<p>Cloudflare Load Balancing Monitors support loading and applying settings for a specific zone to monitoring requests to origin endpoints. This feature has been migrated to new infrastructure to improve reliability, performance, and accuracy.</p> <p>All zone monitors have been tested against the new infrastructure. There should be no change to health monitoring results of currently healthy and active pools. Newly created or re-enabled pools may need validation of their monitor zone settings before being introduced to service, especially regarding correct application of mTLS.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-can-expect">What you can expect:</h4><a class="anchor-link" href="#what-you-can-expect"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>More reliable application of zone settings to monitoring requests, including <ul> <li>Authenticated Origin Pulls</li> <li>Aegis Egress IP Pools</li> <li>Argo Smart Routing</li> <li>HTTP/2 to Origin</li> </ul> </li> <li>Improved support and bug fixes for retries, redirects, and proxied origin resolution</li> <li>Improved performance and reliability of monitoring requests within the Cloudflare network</li> <li>Unrelated CDN or WAF configuration changes should have no risk of impact to pool health</li> </ul>Wed, 06 Aug 2025 00:00:00 GMTLoad BalancingLoad BalancingRadar - Certificate Transparency Insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-08-04-radar-ct-insights/https://developers.cloudflare.com/changelog/post/2025-08-04-radar-ct-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now introduces Certificate Transparency (CT) insights, providing visibility into certificate issuance trends based on Certificate Transparency logs currently monitored by Cloudflare.</p> <p>The following API endpoints are now available:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/methods/timeseries/"><code>/ct/timeseries</code></a>: Retrieves certificate issuance time series.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/methods/summary/"><code>/ct/summary/{dimension}</code></a>: Retrieves certificate distribution by dimension.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/methods/timeseries_groups/"><code>/ct/timeseries_groups/{dimension}</code></a>: Retrieves time series of certificate distribution by dimension.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/authorities/methods/list/"><code>/ct/authorities</code></a>: Lists certification authorities.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/authorities/methods/get/"><code>/ct/authorities/{ca_slug}</code></a>: Retrieves details about a Certification Authority (CA). CA information is derived from the <a href="https://www.ccadb.org/" target="_blank" rel="noopener">Common CA Database (CCADB)<span class="external-link"> ↗</span></a>.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/logs/methods/list/"><code>/ct/logs</code></a>: Lists CT logs.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/logs/methods/get/"><code>/ct/logs/{log_slug}</code></a>: Retrieves details about a CT log. CT log information is derived from the <a href="https://googlechrome.github.io/CertificateTransparency/log_lists.html" target="_blank" rel="noopener">Google Chrome log list<span class="external-link"> ↗</span></a>.</li> </ul> <p>For the <code>summary</code> and <code>timeseries_groups</code> endpoints, the following dimensions are available (and also usable as filters):</p> <ul> <li><code>ca</code>: Certification Authority (certificate issuer)</li> <li><code>ca_owner</code>: Certification Authority Owner</li> <li><code>duration</code>: Certificate validity duration (between NotBefore and NotAfter dates)</li> <li><code>entry_type</code>: Entry type (certificate vs. pre-certificate)</li> <li><code>expiration_status</code>: Expiration status (valid vs. expired)</li> <li><code>has_ips</code>: Presence of IP addresses in certificate <a href="https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/#hostname-and-wildcard-coverage" target="_blank" rel="noopener">Subject Alternative Names (SANs)<span class="external-link"> ↗</span></a></li> <li><code>has_wildcards</code>: Presence of wildcard DNS names in certificate SANs</li> <li><code>log</code>: CT log name</li> <li><code>log_api</code>: CT log API (<a href="https://datatracker.ietf.org/doc/html/rfc6962" target="_blank" rel="noopener">RFC6962<span class="external-link"> ↗</span></a> vs. <a href="https://c2sp.org/static-ct-api" target="_blank" rel="noopener">Static<span class="external-link"> ↗</span></a>)</li> <li><code>log_operator</code>: CT log operator</li> <li><code>public_key_algorithm</code>: Public key algorithm of certificate's key</li> <li><code>signature_algorithm</code>: Signature algorithm used by CA to sign certificate</li> <li><code>tld</code>: Top-level domain for DNS names found in certificates SANs</li> <li><code>validation_level</code>: <a href="https://www.cloudflare.com/learning/ssl/types-of-ssl-certificates/" target="_blank" rel="noopener">Validation level<span class="external-link"> ↗</span></a></li> </ul> <p>Check out the new Certificate Transparency insights in the <a href="https://radar.cloudflare.com/certificate-transparency" target="_blank" rel="noopener">new Radar page<span class="external-link"> ↗</span></a>.</p>Wed, 06 Aug 2025 00:00:00 GMTRadarRadarAgents, Workers - Agents SDK adds MCP Elicitation support, http-streamable support, task queues, email integration and morehttps://developers.cloudflare.com/changelog/post/2025-08-05-agents-MCP-update/https://developers.cloudflare.com/changelog/post/2025-08-05-agents-MCP-update/<p>The latest releases of <a href="https://github.com/cloudflare/agents" target="_blank" rel="noopener">@cloudflare/agents<span class="external-link"> ↗</span></a> brings major improvements to MCP transport protocols support and agents connectivity. Key updates include:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mcp-elicitation-support">MCP elicitation support</h4><a class="anchor-link" href="#mcp-elicitation-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>MCP servers can now request user input during tool execution, enabling interactive workflows like confirmations, forms, and multi-step processes. This feature uses durable storage to preserve elicitation state even during agent hibernation, ensuring seamless user interactions across agent lifecycle events.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Request user confirmation via elicitation</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> confirmation</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">elicitInput</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> message: </span><span class="nb-shiki-mdbnqw">`Are you sure you want to increment the counter by ${</span><span class="nb-shiki-140thh">amount</span><span class="nb-shiki-mdbnqw">}?`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> requestedSchema: {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> properties: {</span></span> <span class="line"><span class="nb-shiki-140thh"> confirmed: {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"boolean"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> title: </span><span class="nb-shiki-mdbnqw">"Confirm increment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Check to confirm the increment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> required: [</span><span class="nb-shiki-mdbnqw">"confirmed"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Check out our <a href="https://github.com/whoiskatrin/agents/tree/main/examples/mcp-elicitation-demo" target="_blank" rel="noopener">demo<span class="external-link"> ↗</span></a> to see elicitation in action.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="http-streamable-transport-for-mcp">HTTP streamable transport for MCP</h4><a class="anchor-link" href="#http-streamable-transport-for-mcp"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>MCP now supports HTTP streamable transport which is recommended over SSE. This transport type offers:</p> <ul> <li><strong>Better performance</strong>: More efficient data streaming and reduced overhead</li> <li><strong>Improved reliability</strong>: Enhanced connection stability and error recover- <strong>Automatic fallback</strong>: If streamable transport is not available, it gracefully falls back to SSE</li> </ul> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> MyMCP.</span><span class="nb-shiki-1t8gfj">serve</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/mcp"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> binding: </span><span class="nb-shiki-mdbnqw">"MyMCP"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>The SDK automatically selects the best available transport method, gracefully falling back from streamable-http to SSE when needed.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enhanced-mcp-connectivity">Enhanced MCP connectivity</h4><a class="anchor-link" href="#enhanced-mcp-connectivity"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Significant improvements to MCP server connections and transport reliability:</p> <ul> <li><strong>Auto transport selection</strong>: Automatically determines the best transport method, falling back from streamable-http to SSE as needed</li> <li><strong>Improved error handling</strong>: Better connection state management and error reporting for MCP servers</li> <li><strong>Reliable prop updates</strong>: Centralized agent property updates ensure consistency across different contexts</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="lightweight-queue-for-fast-task-deferral">Lightweight .queue for fast task deferral</h4><a class="anchor-link" href="#lightweight-queue-for-fast-task-deferral"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can use <code>.queue()</code> to enqueue background work — ideal for tasks like processing user messages, sending notifications etc.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> doSomethingExpensive</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">payload</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // a long running process that you want to run in the background</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> queueSomething</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">queue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"doSomethingExpensive"</span><span class="nb-shiki-140thh">, somePayload); </span><span class="nb-shiki-21nrsd">// this will NOT block further execution, and runs in the background</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">queue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"doSomethingExpensive"</span><span class="nb-shiki-140thh">, someOtherPayload); </span><span class="nb-shiki-21nrsd">// the callback will NOT run until the previous callback is complete</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ... call as many times as you want</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Want to try it yourself? Just define a method like processMessage in your agent, and you’re ready to scale.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-email-adapter">New email adapter</h4><a class="anchor-link" href="#new-email-adapter"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Want to build an AI agent that can receive and respond to emails automatically? With the new email adapter and onEmail lifecycle method, now you can.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> EmailAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> onEmail</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">email</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> AgentEmail</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> raw</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> email.</span><span class="nb-shiki-1t8gfj">getRaw</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> parsed</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> PostalMime.</span><span class="nb-shiki-1t8gfj">parse</span><span class="nb-shiki-140thh">(raw);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // create a response based on the email contents</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // and then send a reply</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">replyToEmail</span><span class="nb-shiki-140thh">(email, {</span></span> <span class="line"><span class="nb-shiki-140thh"> fromName: </span><span class="nb-shiki-mdbnqw">"Email Agent"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> body: </span><span class="nb-shiki-mdbnqw">`Thanks for your email! You've sent us "${</span><span class="nb-shiki-140thh">parsed</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">subject</span><span class="nb-shiki-mdbnqw">}". We'll process it shortly.`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>You route incoming mail like this:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> email</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">email</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> routeAgentEmail</span><span class="nb-shiki-140thh">(email, env, {</span></span> <span class="line"><span class="nb-shiki-140thh"> resolver: </span><span class="nb-shiki-1t8gfj">createAddressBasedEmailResolver</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"EmailAgent"</span><span class="nb-shiki-140thh">),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>You can find a full example <a href="https://github.com/cloudflare/agents/tree/main/examples/email-agent" target="_blank" rel="noopener">here<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="automatic-context-wrapping-for-custom-methods">Automatic context wrapping for custom methods</h4><a class="anchor-link" href="#automatic-context-wrapping-for-custom-methods"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Custom methods are now automatically wrapped with the agent's context, so calling <code>getCurrentAgent()</code> should work regardless of where in an agent's lifecycle it's called. Previously this would not work on RPC calls, but now just works out of the box.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> suggestReply</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">message</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // getCurrentAgent() now correctly works, even when called inside an RPC method</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">agent</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> getCurrentAgent</span><span class="nb-shiki-140thh">()</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> prompt: </span><span class="nb-shiki-mdbnqw">`Suggest a reply to: "${</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}" from "${</span><span class="nb-shiki-140thh">agent</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}"`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: [replyWithEmoji],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Try it out and tell us what you build!</p>Tue, 05 Aug 2025 00:00:00 GMTAgentsAgentsWorkersAgents, Workers - Cloudflare Sandbox SDK adds streaming, code interpreter, Git support, process control and morehttps://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/<p>We’ve shipped a major release for the <a href="https://github.com/cloudflare/sandbox-sdk" target="_blank" rel="noopener">@cloudflare/sandbox<span class="external-link"> ↗</span></a> SDK, turning it into a full-featured, container-based execution platform that runs securely on Cloudflare Workers.</p> <p>This update adds live streaming of output, persistent Python and JavaScript code interpreters with rich output support (charts, tables, HTML, JSON), file system access, Git operations, full background process control, and the ability to expose running services via public URLs.</p> <p>This makes it ideal for building AI agents, CI runners, cloud REPLs, data analysis pipelines, or full developer tools — all without managing infrastructure.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="code-interpreter-python-js-ts">Code interpreter (Python, JS, TS)</h4><a class="anchor-link" href="#code-interpreter-python-js-ts"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Create persistent code contexts with support for rich visual + structured outputs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="createcodecontextoptions">createCodeContext(options)</h4><a class="anchor-link" href="#createcodecontextoptions"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Creates a new code execution context with persistent state.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Create a Python context</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> pythonCtx</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">createCodeContext</span><span class="nb-shiki-140thh">({ language: </span><span class="nb-shiki-mdbnqw">"python"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Create a JavaScript context</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> jsCtx</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">createCodeContext</span><span class="nb-shiki-140thh">({ language: </span><span class="nb-shiki-mdbnqw">"javascript"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure> <p>Options:</p> <ul> <li>language: Programming language ('python' | 'javascript' | 'typescript')</li> <li>cwd: Working directory (default: /workspace)</li> <li>envVars: Environment variables for the context</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="runcodecode-options">runCode(code, options)</h4><a class="anchor-link" href="#runcodecode-options"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Executes code with optional streaming callbacks.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Simple execution</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> execution</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">runCode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'print("Hello World")'</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> context: pythonCtx,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// With streaming callbacks</span></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">runCode</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `</span></span> <span class="line"><span class="nb-shiki-mdbnqw">for i in range(5):</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> print(f"Step {i}")</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> time.sleep(1)</span></span> <span class="line"><span class="nb-shiki-mdbnqw">`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> context: pythonCtx,</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onStdout</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">output</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Real-time:"</span><span class="nb-shiki-140thh">, output.text),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> onResult</span><span class="nb-shiki-140thh">: (</span><span class="nb-shiki-1jdh33">result</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Result:"</span><span class="nb-shiki-140thh">, result),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Options:</p> <ul> <li>language: Programming language ('python' | 'javascript' | 'typescript')</li> <li>cwd: Working directory (default: /workspace)</li> <li>envVars: Environment variables for the context</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="real-time-streaming-output">Real-time streaming output</h4><a class="anchor-link" href="#real-time-streaming-output"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Returns a streaming response for real-time processing.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> stream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">runCodeStream</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "import time; [print(i) for i in range(10)]"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-21nrsd">// Process the stream as needed</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="rich-output-handling">Rich output handling</h4><a class="anchor-link" href="#rich-output-handling"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Interpreter outputs are auto-formatted and returned in multiple formats:</p> <ul> <li>text</li> <li>html (e.g., Pandas tables)</li> <li>png, svg (e.g., Matplotlib charts)</li> <li>json (structured data)</li> <li>chart (parsed visualizations)</li> </ul> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">runCode</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> `</span></span> <span class="line"><span class="nb-shiki-mdbnqw">import seaborn as sns</span></span> <span class="line"><span class="nb-shiki-mdbnqw">import matplotlib.pyplot as plt</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-mdbnqw">data = sns.load_dataset("flights")</span></span> <span class="line"><span class="nb-shiki-mdbnqw">pivot = data.pivot("month", "year", "passengers")</span></span> <span class="line"><span class="nb-shiki-mdbnqw">sns.heatmap(pivot, annot=True, fmt="d")</span></span> <span class="line"><span class="nb-shiki-mdbnqw">plt.title("Flight Passengers")</span></span> <span class="line"><span class="nb-shiki-mdbnqw">plt.show()</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-mdbnqw">pivot.to_dict()</span></span> <span class="line"><span class="nb-shiki-mdbnqw">`</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { context: pythonCtx },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">if</span><span class="nb-shiki-140thh"> (result.png) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Chart output:"</span><span class="nb-shiki-140thh">, result.png);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="preview-urls-from-exposed-ports">Preview URLs from Exposed Ports</h4><a class="anchor-link" href="#preview-urls-from-exposed-ports"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Start background processes and expose them with live URLs.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">startProcess</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"python -m http.server 8000"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> preview</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">exposePort</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">8000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Live preview at:"</span><span class="nb-shiki-140thh">, preview.url);</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="full-process-lifecycle-control">Full process lifecycle control</h4><a class="anchor-link" href="#full-process-lifecycle-control"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Start, inspect, and terminate long-running background processes.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> process</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">startProcess</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"node server.js"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Started process ${</span><span class="nb-shiki-140thh">process</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">id</span><span class="nb-shiki-mdbnqw">} with PID ${</span><span class="nb-shiki-140thh">process</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">pid</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Monitor the process</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> logStream</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">streamProcessLogs</span><span class="nb-shiki-140thh">(process.id);</span></span> <span class="line"><span class="nb-shiki-1itgoe">for</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> log</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-1t8gfj"> parseSSEStream</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">LogEvent</span><span class="nb-shiki-140thh">&gt;(logStream)) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Server: ${</span><span class="nb-shiki-140thh">log</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">data</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <ul> <li>listProcesses() - List all running processes</li> <li>getProcess(id) - Get detailed process status</li> <li>killProcess(id, signal) - Terminate specific processes</li> <li>killAllProcesses() - Kill all processes</li> <li>streamProcessLogs(id, options) - Stream logs from running processes</li> <li>getProcessLogs(id) - Get accumulated process output</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="git-integration">Git integration</h4><a class="anchor-link" href="#git-integration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Clone Git repositories directly into the sandbox.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">gitCheckout</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://github.com/user/repo"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> branch: </span><span class="nb-shiki-mdbnqw">"main"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> targetDir: </span><span class="nb-shiki-mdbnqw">"my-project"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Sandboxes are still experimental. We're using them to explore how isolated, container-like workloads might scale on Cloudflare — and to help define the developer experience around them.</p>Tue, 05 Aug 2025 00:00:00 GMTAgentsAgentsWorkersAgents, Workers AI - OpenAI open models now available on Workers AIhttps://developers.cloudflare.com/changelog/post/2025-08-05-openai-open-models/https://developers.cloudflare.com/changelog/post/2025-08-05-openai-open-models/<p>We're thrilled to be a Day 0 partner with <a href="http://openai.com/index/introducing-gpt-oss" target="_blank" rel="noopener">OpenAI<span class="external-link"> ↗</span></a> to bring their <a href="https://openai.com/index/gpt-oss-model-card/" target="_blank" rel="noopener">latest open models<span class="external-link"> ↗</span></a> to Workers AI, including support for Responses API, Code Interpreter, and Web Search (coming soon).</p> <p>Get started with the new models at <code>@cf/openai/gpt-oss-120b</code> and <code>@cf/openai/gpt-oss-20b</code>. Check out the <a href="https://blog.cloudflare.com/openai-gpt-oss-on-workers-ai" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> for more details about the new models, and the <a href="https://developers.cloudflare.com/workers-ai/models/gpt-oss-120b"><code>gpt-oss-120b</code></a> and <a href="https://developers.cloudflare.com/workers-ai/models/gpt-oss-20b"><code>gpt-oss-20b</code></a> model pages for more information about pricing and context windows.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="responses-api">Responses API</h4><a class="anchor-link" href="#responses-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you call the model through:</p> <ul> <li>Workers Binding, it will accept/return Responses API – <code>env.AI.run(“@cf/openai/gpt-oss-120b”)</code></li> <li>REST API on <code>/run</code> endpoint, it will accept/return Responses API – <code>https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/ai/run/@cf/openai/gpt-oss-120b</code></li> <li>REST API on new <code>/responses</code> endpoint, it will accept/return Responses API – <code>https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/ai/v1/responses</code></li> <li>REST API for OpenAI Compatible endpoint, it will return Chat Completions (coming soon) – <code>https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/ai/v1/chat/completions</code></li> </ul> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">curl https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/ai/v1/responses \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -H "Content-Type: application/json" \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -H "Authorization: Bearer $CLOUDFLARE_API_KEY" \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -d '{</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "model": "@cf/openai/gpt-oss-120b",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "reasoning": {"effort": "medium"},</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "input": [</span></span> <span class="line"><span class="nb-shiki-wvjl67"> {</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "content": "What are the benefits of open-source models?"</span></span> <span class="line"><span class="nb-shiki-wvjl67"> }</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ]</span></span> <span class="line"><span class="nb-shiki-wvjl67"> }'</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="code-interpreter">Code Interpreter</h4><a class="anchor-link" href="#code-interpreter"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The model is natively trained to support stateful code execution, and we've implemented support for this feature using our <a href="https://github.com/cloudflare/sandbox-sdk" target="_blank" rel="noopener">Sandbox SDK<span class="external-link"> ↗</span></a> and <a href="https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/" target="_blank" rel="noopener">Containers<span class="external-link"> ↗</span></a>. Cloudflare's Developer Platform is uniquely positioned to support this feature, so we're very excited to bring our products together to support this new use case.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="web-search-coming-soon">Web Search (coming soon)</h4><a class="anchor-link" href="#web-search-coming-soon"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We are working to implement Web Search for the model, where users can bring their own Exa API Key so the model can browse the Internet.</p>Tue, 05 Aug 2025 00:00:00 GMTAgentsAgentsWorkers AIWorkers - Increased disk space for Workers Buildshttps://developers.cloudflare.com/changelog/post/2025-08-04-builds-increased-disk-size/https://developers.cloudflare.com/changelog/post/2025-08-04-builds-increased-disk-size/<p>As part of the ongoing open beta for <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a>, we’ve increased the available disk space for builds from <strong>8 GB</strong> to <strong>20 GB</strong> for both Free and Paid plans.</p> <p>This provides more space for larger projects, dependencies, and build artifacts while improving overall build reliability.</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Metric</th> <th>Free Plan</th> <th>Paid Plans</th> </tr> </thead> <tbody> <tr> <td>Disk Space</td> <td>20 GB</td> <td>20 GB</td> </tr> </tbody> </table></div> <p>All other <a href="https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/">build limits</a> — including CPU, memory, build minutes, and timeout remain unchanged.</p>Mon, 04 Aug 2025 01:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-08-04https://developers.cloudflare.com/changelog/post/2025-08-04-waf-release/https://developers.cloudflare.com/changelog/post/2025-08-04-waf-release/ <p>This week's highlight focuses on a series of significant vulnerabilities identified across widely adopted web platforms, from enterprise-grade CMS to essential backend administration tools. The findings reveal multiple vectors for attack, including critical flaws that allow for full server compromise and others that enable targeted attacks against users.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Sitecore (CVE-2025-34509, CVE-2025-34510, CVE-2025-34511): A hardcoded credential allows remote attackers to access administrative APIs. Once authenticated, they can exploit an additional vulnerability to upload arbitrary files, leading to remote code execution.</p> </li> <li> <p>Grafana (CVE-2025-4123): A cross-site scripting (XSS) vulnerability allows an attacker to redirect users to a malicious website, which can then execute arbitrary JavaScript in the victim's browser.</p> </li> <li> <p>LaRecipe (CVE-2025-53833): Through Server-Side Template Injection, attackers can execute arbitrary commands on the server, potentially access sensitive environment variables, and escalate access depending on server configuration.</p> </li> <li> <p>CentOS WebPanel (CVE-2025-48703): A command injection vulnerability could allow a remote attacker to execute arbitrary commands on the server.</p> </li> <li> <p>WordPress (CVE-2023-5561): This vulnerability allows unauthenticated attackers to determine the email addresses of users who have published public posts on an affected website.</p> </li> <li> <p>WordPress Plugin - WPBookit (CVE-2025-6058): A missing file type validation allows unauthenticated attackers to upload arbitrary files to the server, creating the potential for remote code execution.</p> </li> <li> <p>WordPress Theme - Motors (CVE-2025-4322): Due to improper identity validation, an unauthenticated attacker can change the passwords of arbitrary users, including administrators, to gain access to their accounts.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities pose a multi-layered threat to widely adopted web technologies, ranging from enterprise-grade platforms like Sitecore to everyday solutions such as WordPress, and backend tools like CentOS WebPanel. The most severe risks originate in remote code execution (RCE) flaws found in Sitecore, CentOS WebPanel, LaRecipe, and the WPBookit plugin. These allow attackers to bypass security controls and gain deep access to the server, enabling them to steal sensitive data, deface websites, install persistent malware, or use the compromised server as a launchpad for further attacks.</p> <p>The privilege escalation vulnerability is the Motors theme, which allows for a complete administrative account takeover on WordPress sites. This effectively hands control of the application to an attacker, who can then manipulate content, exfiltrate user data, and alter site functionality without needing to breach the server itself.</p> <p>The Grafana cross-site scripting (XSS) flaw can be used to hijack authenticated user sessions or steal credentials, turning a trusted user's browser into an attack vector.</p> <p>Meanwhile, the information disclosure flaw in WordPress core provides attackers with valid user emails, fueling targeted phishing campaigns that aim to secure the same account access achievable through the other exploits.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b8ab4644f8044f3485441ee052f30a13"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...52f30a13</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100535A</td><td>Sitecore - Dangerous File Upload - CVE:CVE-2025-34510, CVE:CVE-2025-34511</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="06d1fe0bd6e44d868e6b910b5045a97f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5045a97f</span></button></rule-id></td><td>100535</td><td>Sitecore - Information Disclosure - CVE:CVE-2025-34509</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f71ce87ea6e54eab999223df579cd3e0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...579cd3e0</span></button></rule-id></td><td>100543</td><td>Grafana - Directory Traversal - CVE:CVE-2025-4123</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bba3d37891a440fb8bc95b970cbd9abc"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0cbd9abc</span></button></rule-id></td><td>100545</td><td>WordPress - Information Disclosure - CVE:CVE-2023-5561</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="28108d25f1cf470c8e7648938f634977"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8f634977</span></button></rule-id></td><td>100820</td><td>CentOS WebPanel - Remote Code Execution - CVE:CVE-2025-48703</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9d69c796a61444a3aca33dc282ae64c1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...82ae64c1</span></button></rule-id></td><td>100821</td><td>LaRecipe - SSTI - CVE:CVE-2025-53833</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9b5c5e13d2ca4253a89769f2194f7b2d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...194f7b2d</span></button></rule-id></td><td>100822</td><td>WordPress:Plugin:WPBookit - Remote Code Execution - CVE:CVE-2025-6058</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="69d43d704b0641898141a4300bf1b661"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0bf1b661</span></button></rule-id></td><td>100823</td><td>WordPress:Theme:Motors - Privilege Escalation - CVE:CVE-2025-4322</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 04 Aug 2025 00:00:00 GMTWAFWAFCloudflare Fundamentals, Terraform - Terraform v5.8.2 now availablehttps://developers.cloudflare.com/changelog/post/2025-08-01-terraform-v5.8.2-provider/https://developers.cloudflare.com/changelog/post/2025-08-01-terraform-v5.8.2-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. We are aware of the high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by the Cloudflare community related to the v5 release. We have committed to releasing improvements on a 2 week cadeance to ensure it's stability and reliability. We have also pivoted from an issue-to-issue approach to a resource-per-resource approach - we will be focusing on specific resources for every release, stabilizing the release and closing all associated bugs with that resource before moving onto resolving migration issues.</p> <p>Thank you for continuing to raise issues. We triage them weekly and they help make our products stronger.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Resources stabilized: <ul> <li><code>cloudflare_custom_pages</code></li> <li><code>cloudflare_page_rule</code></li> <li><code>cloudflare_dns_record</code></li> <li><code>cloudflare_argo_tiered_caching</code></li> </ul> </li> <li>Addressed chronic drift issues in <code>cloudflare_logpush_job</code>, <code>cloudflare_zero_trust_dns_location</code>, <code>cloudflare_ruleset</code> &amp; <code>cloudflare_api_token</code></li> <li><code>cloudflare_zone_subscription</code> returns expected values <code>rate_plan.id</code> from former versions</li> <li><code>cloudflare_workers_script</code> can now successfully be destroyed with bindings &amp; migration for Durable Objects now recorded in tfstate</li> <li>Ability to configure <code>add_headers</code> under <code>cloudflare_zero_trust_gateway_policy</code></li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, see the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.8.2" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5666" target="_blank" rel="noopener">#5666: cloudflare_ruleset example lists id which is a read-only field<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5578" target="_blank" rel="noopener">#5578: cloudflare_logpush_job plan always suggests changes<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5552" target="_blank" rel="noopener">#5552: 5.4.0: Since provider update, existing cloudflare_list_item would be recreated "created" state<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5670" target="_blank" rel="noopener">#5670: cloudflare_zone_subscription: uses wrong ID field in Read/Update<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5548" target="_blank" rel="noopener">#5548: cloudflare_api_token resource always shows changes (drift)<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5634" target="_blank" rel="noopener">#5634: cloudflare_workers_script with bindings fails to be destroyed<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5616" target="_blank" rel="noopener">#5616: cloudflare_workers_script Unable to deploy worker assets<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5331" target="_blank" rel="noopener">#5331: cloudflare_workers_script 500 internal server error when uploading python<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5701" target="_blank" rel="noopener">#5701: cloudflare_workers_script migrations for Durable Objects not recorded in tfstate; cannot be upgraded between versions<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5704" target="_blank" rel="noopener">#5704: cloudflare_workers_script randomly fails to deploy when changing compatibility_date<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5439" target="_blank" rel="noopener">#5439: cloudflare_workers_script (v5.2.0) ignoring content and bindings properties<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5522" target="_blank" rel="noopener">#5522: cloudflare_workers_script always detects changes after apply<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5693" target="_blank" rel="noopener">#5693: cloudflare_zero_trust_access_identity_provider gives recurring change on OTP pin login<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5567" target="_blank" rel="noopener">#5567: cloudflare_r2_custom_domain doesn't roundtrip jurisdiction properly<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5179" target="_blank" rel="noopener">#5179: Bad request with when creating cloudflare_api_shield_schema resource<span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new one if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest holding off on migration to v5 while we work on stabilization. This help will you avoid any blocking issues while the Terraform resources are actively being stabilized.</p> <p>If you'd like more information on migrating from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition, although these do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Fri, 01 Aug 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers - Develop locally with Containers and the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-08-01-containers-in-vite-dev/https://developers.cloudflare.com/changelog/post/2025-08-01-containers-in-vite-dev/ <p>You can now configure and run <a href="https://developers.cloudflare.com/containers">Containers</a> alongside your <a href="https://developers.cloudflare.com/workers">Worker</a> during local development when using the <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a>. Previously, you could only develop locally when using <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> as your local development server.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration">Configuration</h4><a class="anchor-link" href="#configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can simply configure your Worker and your Container(s) in your Wrangler configuration file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"container-starter"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "main"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"src/index.js"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "containers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "class_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MyContainer"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "image"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./Dockerfile"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "instances"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">5</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "durable_objects"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bindings"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "class_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MyContainer"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_CONTAINER"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "new_sqlite_classes"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "MyContainer"</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"v1"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"container-starter"</span></span> <span class="line"><span class="nb-shiki-140thh">main = </span><span class="nb-shiki-mdbnqw">"src/index.js"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">containers</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">class_name = </span><span class="nb-shiki-mdbnqw">"MyContainer"</span></span> <span class="line"><span class="nb-shiki-140thh">image = </span><span class="nb-shiki-mdbnqw">"./Dockerfile"</span></span> <span class="line"><span class="nb-shiki-140thh">instances = </span><span class="nb-shiki-dzsirb">5</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">durable_objects</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">bindings</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">class_name = </span><span class="nb-shiki-mdbnqw">"MyContainer"</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"MY_CONTAINER"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">migrations</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">new_sqlite_classes = [ </span><span class="nb-shiki-mdbnqw">"MyContainer"</span><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">tag = </span><span class="nb-shiki-mdbnqw">"v1"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="worker-code">Worker Code</h4><a class="anchor-link" href="#worker-code"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Once your Worker and Containers are configured, you can access the Container instances from your Worker code:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Container, getContainer } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/containers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyContainer</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Container</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> defaultPort</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> 4000</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// Port the container is listening on</span></span> <span class="line"><span class="nb-shiki-1jdh33"> sleepAfter</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "10m"</span><span class="nb-shiki-140thh">; </span><span class="nb-shiki-21nrsd">// Stop the instance if requests not sent for 10 minutes</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">async </span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request, env) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-mdbnqw">"session-id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">sessionId</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> request.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Get the container instance for the given session ID</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> containerInstance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getContainer</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">MY_CONTAINER</span><span class="nb-shiki-140thh">, sessionId)</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Pass the request to the container instance on its default port</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> containerInstance.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="local-development">Local development</h4><a class="anchor-link" href="#local-development"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To develop your Worker locally, start a local dev server by running</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">vite</span><span class="nb-shiki-mdbnqw"> dev</span></span></code></pre></figure> <p>in your terminal.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="resources">Resources</h4><a class="anchor-link" href="#resources"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Learn more about <a href="https://developers.cloudflare.com/containers/" target="_blank" rel="noopener">Cloudflare Containers<span class="external-link"> ↗</span></a> or the <a href="https://developers.cloudflare.com/workers/vite-plugin/" target="_blank" rel="noopener">Cloudflare Vite plugin<span class="external-link"> ↗</span></a> in our developer docs.</p>Fri, 01 Aug 2025 00:00:00 GMTWorkersWorkersCloudflare WAN - Terraform V5 support for tunnels and routeshttps://developers.cloudflare.com/changelog/post/2025-07-31-terraform-v5-tunnels-routes/https://developers.cloudflare.com/changelog/post/2025-07-31-terraform-v5-tunnels-routes/<p>The Cloudflare Terraform provider resources for Cloudflare WAN tunnels and routes now support Terraform provider version 5. Customers using infrastructure-as-code workflows can manage their tunnel and route configuration with the latest provider version.</p> <p>For more information, refer to the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Cloudflare Terraform provider documentation<span class="external-link"> ↗</span></a>.</p>Thu, 31 Jul 2025 00:00:00 GMTCloudflare WANCloudflare WANMagic Transit, Cloudflare WAN - Magic Transit and Magic WAN health check data is fully compatible with the CMB EU setting.https://developers.cloudflare.com/changelog/post/2025-07-30-mt-mwan-health-check-cmb-eu/https://developers.cloudflare.com/changelog/post/2025-07-30-mt-mwan-health-check-cmb-eu/<p>Today, we are excited to announce that all Magic Transit and Magic WAN customers with CMB EU (<a href="https://developers.cloudflare.com/data-localization/metadata-boundary/">Customer Metadata Boundary - Europe</a>) enabled in their account will be able to access GRE, IPsec, and CNI health check and traffic volume data in the Cloudflare dashboard and via API.</p> <p>This ensures that all Magic Transit and Magic WAN customers with CMB EU enabled will be able to access all Magic Transit and Magic WAN features.</p> <p>Specifically, these two GraphQL endpoints are now compatible with CMB EU:</p> <ul> <li><code>magicTransitTunnelHealthChecksAdaptiveGroups</code></li> <li><code>magicTransitTunnelTrafficAdaptiveGroups</code></li> </ul>Wed, 30 Jul 2025 00:00:00 GMTMagic TransitMagic TransitCloudflare WANWorkers, Secrets Store - Deploy to Cloudflare buttons now support Worker environment variables, secrets, and Secrets Store secretshttps://developers.cloudflare.com/changelog/post/2025-07-01-workers-deploy-button-supports-environment-variables-and-secrets/https://developers.cloudflare.com/changelog/post/2025-07-01-workers-deploy-button-supports-environment-variables-and-secrets/ <p>Any template which uses <a href="https://developers.cloudflare.com/workers/configuration/environment-variables/">Worker environment variables</a>, <a href="https://developers.cloudflare.com/workers/configuration/secrets/">secrets</a>, or <a href="https://developers.cloudflare.com/secrets-store/">Secrets Store secrets</a> can now be deployed using a <a href="https://developers.cloudflare.com/workers/platform/deploy-buttons/">Deploy to Cloudflare button</a>.</p> <p>Define environment variables and secrets store bindings in your Wrangler configuration file as normal:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "main"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./src/index.ts"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "vars"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "API_HOST"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"https://example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "secrets_store_secrets"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"API_KEY"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "store_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"demo"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "secret_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"api-key"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-worker"</span></span> <span class="line"><span class="nb-shiki-140thh">main = </span><span class="nb-shiki-mdbnqw">"./src/index.ts"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">vars</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">API_HOST = </span><span class="nb-shiki-mdbnqw">"https://example.com"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">secrets_store_secrets</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"API_KEY"</span></span> <span class="line"><span class="nb-shiki-140thh">store_id = </span><span class="nb-shiki-mdbnqw">"demo"</span></span> <span class="line"><span class="nb-shiki-140thh">secret_name = </span><span class="nb-shiki-mdbnqw">"api-key"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Add secrets to a <code>.dev.vars.example</code> or <code>.env.example</code> file:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ini"><figcaption class="nb-code-title"><span class="nb-code-title-name">.dev.vars.example</span><span class="nb-code-title-lang">ini</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ini" data-nb-lang="ini"><code><span class="line"><span class="nb-shiki-1itgoe">COOKIE_SIGNING_KEY</span><span class="nb-shiki-140thh">=my-secret </span><span class="nb-shiki-21nrsd"># comment</span></span></code></pre></figure> <p>And optionally, you can add a description for these bindings in your template's <code>package.json</code> to help users understand how to configure each value:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">package.json</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "private"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cloudflare"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bindings"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "API_KEY"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Select your company's API key for connecting to the example service."</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "COOKIE_SIGNING_KEY"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "description"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Generate a random string using `openssl rand -hex 32`."</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>These secrets and environment variables will be presented to users in the dashboard as they deploy this template, allowing them to configure each value. Additional information about creating templates and Deploy to Cloudflare buttons can be found in <a href="https://developers.cloudflare.com/workers/platform/deploy-buttons/">our documentation</a>.</p>Tue, 29 Jul 2025 01:00:00 GMTWorkersWorkersSecrets StoreAudit Logs - Audit logs (version 2) - UI Beta Releasehttps://developers.cloudflare.com/changelog/post/2025-07-29-audit-logs-v2-ui-beta/https://developers.cloudflare.com/changelog/post/2025-07-29-audit-logs-v2-ui-beta/<p>The Audit Logs v2 UI is now available to all Cloudflare customers in Beta. This release builds on the public <a href="https://developers.cloudflare.com/changelog/product/audit-logs/">Beta of the Audit Logs v2 API</a> and introduces a redesigned user interface with powerful new capabilities to make it easier to investigate account activity.</p> <p><strong>Enabling the new UI</strong></p> <p>To try the new user interface, go to <strong>Manage Account &gt; Audit Logs</strong>. The previous version of Audit Logs remains available and can be re-enabled at any time using the <strong>Switch back to old Audit Logs</strong> link in the banner at the top of the page.</p> <p><strong>New Features:</strong></p> <ul> <li><strong>Advanced Filtering</strong>: Filter logs by actor, resource, method, and more for faster insights.</li> <li><strong>On-hover filter controls</strong>: Easily include or exclude values in queries by hovering over fields within a log entry.</li> <li><strong>Detailed Log Sidebar</strong>: View rich context for each log entry without leaving the main view.</li> <li><strong>JSON Log View</strong>: Inspect the raw log data in a structured JSON format.</li> <li><strong>Custom Time Ranges</strong>: Define your own time windows to view historical activity.</li> <li><strong>Infinite Scroll</strong>: Seamlessly browse logs without clicking through pages.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1300,height=686,format=webp/_astro/Audit_logs_v2_filters.Bacd1IHg.png" alt="Audit Logs v2 new UI" loading="lazy" decoding="async" width="1300" height="686"> <p>For more details on Audit Logs v2, see the <a href="https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/" target="_blank" rel="noopener">Audit Logs documentation<span class="external-link"> ↗</span></a>.</p> <p><strong>Known issues</strong></p> <ul> <li>A small number of audit logs may currently be unavailable in Audit Logs v2. In some cases, certain fields such as actor information may be missing in certain audit logs. We are actively working to improve coverage and completeness for General Availability.</li> <li>Export to CSV is not supported in the new UI.</li> </ul> <p>We are actively refining the Audit Logs v2 experience and welcome your feedback. You can share overall feedback by clicking the thumbs up or thumbs down icons at the top of the page, or provide feedback on specific audit log entries using the thumbs icons next to each audit log line or by filling out our <a href="https://docs.google.com/forms/d/e/1FAIpQLSfXGkJpOG1jUPEh-flJy9B13icmcdBhveFwe-X0EzQjJQnQfQ/viewform?usp=sharing" target="_blank" rel="noopener">feedback form<span class="external-link"> ↗</span></a>.</p>Tue, 29 Jul 2025 00:00:00 GMTAudit LogsAudit LogsBrowser Run - Introducing pricing for the Browser Rendering API — $0.09 per browser hourhttps://developers.cloudflare.com/changelog/post/2025-07-28-br-pricing/https://developers.cloudflare.com/changelog/post/2025-07-28-br-pricing/<p>We’ve launched pricing for <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a>, including a free tier and a pay-as-you-go model that scales with your needs. Starting <strong>August 20, 2025</strong>, Cloudflare will begin billing for Browser Rendering.</p> <p>There are two ways to use Browser Rendering. Depending on the method you use, here’s how billing will work:</p> <ul> <li><a href="https://developers.cloudflare.com/browser-run/quick-actions/"><strong>REST API</strong></a>: Charged for <strong>Duration</strong> only ($/browser hour)</li> <li><a href="https://developers.cloudflare.com/browser-run/#integration-methods"><strong>Browser Sessions</strong></a>: Charged for both <strong>Duration</strong> and <strong>Concurrency</strong> ($/browser hour and # of concurrent browsers)</li> </ul> <p>Included usage and pricing by plan</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Plan</th> <th>Included duration</th> <th>Included concurrency</th> <th>Price (beyond included)</th> </tr> </thead> <tbody> <tr> <td><strong>Workers Free</strong></td> <td>10 minutes per day</td> <td>3 concurrent browsers</td> <td>N/A</td> </tr> <tr> <td><strong>Workers Paid</strong></td> <td>10 hours per month</td> <td>10 concurrent browsers (averaged monthly)</td> <td><strong>1. REST API</strong>: $0.09 per additional browser hour <br><strong>2. Workers Bindings</strong>: $0.09 per additional browser hour <br> $2.00 per additional concurrent browser</td> </tr> </tbody> </table></div> <p>What you need to know:</p> <ul> <li><strong>Workers Free Plan:</strong> 10 minutes of browser usage per day with 3 concurrent browsers at no charge.</li> <li><strong>Workers Paid Plan:</strong> 10 hours of browser usage per month with 10 concurrent browsers (averaged monthly) at no charge. Additional usage is charged as shown above.</li> </ul> <p>You can monitor usage via the <a href="https://dash.cloudflare.com/?to=/:account/workers/browser-run" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>. Go to <strong>Compute</strong> &gt; <strong>Browser Run</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1880,height=1080,format=webp/_astro/dashboard.BQnX87lT.png" alt="Browser Rendering dashboard" loading="lazy" decoding="async" width="1880" height="1080"> <p>If you've been using Browser Rendering and do not wish to incur charges, ensure your usage stays within your plan's <a href="https://developers.cloudflare.com/browser-run/pricing/">included usage</a>. To estimate costs, take a look at these <a href="https://developers.cloudflare.com/browser-run/pricing/#examples-of-workers-paid-pricing">example pricing scenarios</a>.</p>Mon, 28 Jul 2025 12:00:00 GMTBrowser RunBrowser RunGateway - Scam domain category introduced under Security Threatshttps://developers.cloudflare.com/changelog/post/2025-07-28-Spam-domain-category-introduced/https://developers.cloudflare.com/changelog/post/2025-07-28-Spam-domain-category-introduced/<p>We have introduced a new Security Threat category called <strong>Scam</strong>. Relevant domains are marked with the Scam category. Scam typically refers to fraudulent websites and schemes designed to trick victims into giving away money or personal information.</p> <p><strong>New category added</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Parent ID</th> <th>Parent Name</th> <th>Category ID</th> <th>Category Name</th> </tr> </thead> <tbody> <tr> <td>21</td> <td>Security Threats</td> <td>191</td> <td>Scam</td> </tr> </tbody> </table></div> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/domain-categories/">Gateway domain categories</a> to learn more.</p>Mon, 28 Jul 2025 00:00:00 GMTGatewayGatewayWAF - WAF Release - 2025-07-28https://developers.cloudflare.com/changelog/post/2025-07-28-waf-release/https://developers.cloudflare.com/changelog/post/2025-07-28-waf-release/ <p>This week’s update spotlights several vulnerabilities across Apache Tomcat, MongoDB, and Fortinet FortiWeb. Several flaws related with a memory leak in Apache Tomcat can lead to a denial-of-service attack. Additionally, a code injection flaw in MongoDB's Mongoose library allows attackers to bypass security controls to access restricted data.</p> <p><strong>Key Findings</strong></p> <ul> <li> <p>Fortinet FortiWeb (CVE-2025-25257): An improper neutralization of special elements used in a SQL command vulnerability in Fortinet FortiWeb versions allows an unauthenticated attacker to execute unauthorized SQL code or commands.</p> </li> <li> <p>Apache Tomcat (CVE-2025-31650): A improper Input Validation vulnerability in Apache Tomcat that could create memory leak when incorrect error handling for some invalid HTTP priority headers resulted in incomplete clean-up of the failed request.</p> </li> <li> <p>MongoDB (CVE-2024-53900, CVE:CVE-2025-23061): Improper use of <code>$where</code> in match and a nested <code>$where</code> filter with a <code>populate()</code> match in Mongoose can lead to search injection.</p> </li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities target user-facing components, web application servers, and back-end databases. A SQL injection flaw in Fortinet FortiWeb can lead to data theft or system compromise. A separate issue in Apache Tomcat involves a memory leak from improper input validation, which could be exploited for a denial-of-service (DoS) attack. Finally, a vulnerability in MongoDB's Mongoose library allows attackers to bypass security filters and access unauthorized data through malicious search queries.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6ab3bd3b58fb4325ac2d3cc73461ec9e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3461ec9e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100804</td><td>BerriAI - SSRF - CVE:CVE-2024-6587</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2e6c4d02f42a4c3ca90649d50cb13e1d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0cb13e1d</span></button></rule-id></td><td>100812</td><td>Fortinet FortiWeb - Remote Code Execution - CVE:CVE-2025-25257</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fd360d8fd9994e6bab6fb06067fae7f7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...67fae7f7</span></button></rule-id></td><td>100813</td><td>Apache Tomcat - DoS - CVE:CVE-2025-31650</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f9e01e28c5d6499cac66364b4b6a5bb1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4b6a5bb1</span></button></rule-id></td><td>100815</td><td>MongoDB - Remote Code Execution - CVE:CVE-2024-53900, CVE:CVE-2025-23061</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="700d4fcc7b1f481a80cbeee5688f8e79"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...688f8e79</span></button></rule-id></td><td>100816</td><td>MongoDB - Remote Code Execution - CVE:CVE-2024-53900, CVE:CVE-2025-23061</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 28 Jul 2025 00:00:00 GMTWAFWAFGateway - Gateway HTTP Filtering on all ports available in open BETAhttps://developers.cloudflare.com/changelog/post/2025-07-24-HTTP-Inspection-on-all-ports/https://developers.cloudflare.com/changelog/post/2025-07-24-HTTP-Inspection-on-all-ports/<p><a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway</a> can now apply <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP filtering</a> to all proxied HTTP requests, not just traffic on standard HTTP (<code>80</code>) and HTTPS (<code>443</code>) ports. This means all requests can now be filtered by <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/antivirus-scanning/">A/V scanning</a>, <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/file-sandboxing/">file sandboxing</a>, <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/#data-in-transit">Data Loss Prevention (DLP)</a>, and more.</p> <p>You can turn this <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/#inspect-on-all-ports">setting</a> on by going to <strong>Settings</strong> &gt; <strong>Network</strong> &gt; <strong>Firewall</strong> and choosing <em>Inspect on all ports</em>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1096,height=535,format=webp/_astro/Gateway-Inspection-all-ports.CCmwX6D0.png" alt="HTTP Inspection on all ports setting" loading="lazy" decoding="async" width="1096" height="535"> <p>To learn more, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/#inspect-on-all-ports">Inspect on all ports (Beta)</a>.</p>Thu, 24 Jul 2025 00:00:00 GMTGatewayGatewayBrowser Run - Browser Rendering now supports local developmenthttps://developers.cloudflare.com/changelog/post/2025-07-22-br-local-dev/https://developers.cloudflare.com/changelog/post/2025-07-22-br-local-dev/<p>You can now run your Browser Rendering locally using <code>npx wrangler dev</code>, which spins up a browser directly on your machine before deploying to Cloudflare's global network. By running tests locally, you can quickly develop, debug, and test changes without needing to deploy or worry about usage costs.</p> <p>Get started with this <a href="https://developers.cloudflare.com/browser-run/how-to/deploy-worker/">example guide</a> that shows how to use Cloudflare's <a href="https://developers.cloudflare.com/browser-run/puppeteer/">fork of Puppeteer</a> (you can also use <a href="https://developers.cloudflare.com/browser-run/playwright/">Playwright</a>) to take screenshots of webpages and store the results in <a href="https://developers.cloudflare.com/kv/">Workers KV</a>.</p>Tue, 22 Jul 2025 11:00:00 GMTBrowser RunBrowser RunWorkers - Test out code changes before shipping with per-branch preview deployments for Cloudflare Workershttps://developers.cloudflare.com/changelog/post/2025-07-23-workers-preview-urls/https://developers.cloudflare.com/changelog/post/2025-07-23-workers-preview-urls/<p>Now, when you connect your Cloudflare Worker to a git repository on GitHub or GitLab, each branch of your repository has its own stable preview URL, that you can use to preview code changes before merging the pull request and deploying to production.</p> <p>This works the same way that Cloudflare Pages does — every time you create a pull request, you'll automatically get a shareable preview link where you can see your changes running, without affecting production. The link stays the same, even as you add commits to the same branch. These preview URLs are named after your branch and are posted as a comment to each pull request. The URL stays the same with every commit and always points to the latest version of that branch.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2900,height=1064,format=webp/_astro/preview-urls-comment.0wQffFIq.png" alt="PR comment preview" loading="lazy" decoding="async" width="2900" height="1064"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="preview-url-types">Preview URL types</h4><a class="anchor-link" href="#preview-url-types"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Each comment includes <strong>two preview URLs</strong> as shown above:</p> <ul> <li><strong>Commit Preview URL</strong>: Unique to the specific version/commit (e.g., <code>&lt;version-prefix&gt;-&lt;worker-name&gt;.&lt;subdomain&gt;.workers.dev</code>)</li> <li><strong>Branch Preview URL</strong>: A stable alias based on the branch name (e.g., <code>&lt;branch-name&gt;-&lt;worker-name&gt;.&lt;subdomain&gt;.workers.dev</code>)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you create a pull request:</p> <ul> <li><strong>A preview alias is automatically created</strong> based on the Git branch name (e.g., <code>&lt;branch-name&gt;</code> becomes <code>&lt;branch-name&gt;-&lt;worker-name&gt;.&lt;subdomain&gt;.workers.dev</code>)</li> <li><strong>No configuration is needed</strong>, the alias is generated for you</li> <li><strong>The link stays the same</strong> even as you add commits to the same branch</li> <li><strong>Preview URLs are posted directly to your pull request as comments</strong> (just like they are in Cloudflare Pages)</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="custom-alias-name">Custom alias name</h4><a class="anchor-link" href="#custom-alias-name"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can also assign a custom preview alias using the <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler CLI</a>, by passing the <code>--preview-alias</code> flag when <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#versions-upload">uploading a version</a> of your Worker:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> versions</span><span class="nb-shiki-mdbnqw"> upload</span><span class="nb-shiki-dzsirb"> --preview-alias</span><span class="nb-shiki-mdbnqw"> staging</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="limitations-while-in-beta">Limitations while in beta</h4><a class="anchor-link" href="#limitations-while-in-beta"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Only available on the <strong>workers.dev</strong> subdomain (custom domains not yet supported)</li> <li>Requires <strong>Wrangler v4.21.0+</strong></li> <li>Preview URLs are not generated for Workers that use <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a></li> <li>Not yet supported for <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/">Workers for Platforms</a></li> </ul>Tue, 22 Jul 2025 01:00:00 GMTWorkersWorkersGateway - Google Bard Application replaced by Geminihttps://developers.cloudflare.com/changelog/post/2025-08-15-gemini-application-replaces-bard/https://developers.cloudflare.com/changelog/post/2025-08-15-gemini-application-replaces-bard/<p>The <strong>Google Bard</strong> application (ID: 1198) has been deprecated and fully removed from the system. It has been replaced by the <strong>Gemini</strong> application (ID: 1340). Any existing Gateway policies that reference the old Google Bard application will no longer function. To ensure your policies continue to work as intended, you should update them to use the new Gemini application. We recommend replacing all instances of the deprecated Bard application with the new Gemini application in your Gateway policies. For more information about application policies, please see the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/application-app-types/">Cloudflare Gateway documentation</a>.</p>Tue, 22 Jul 2025 00:00:00 GMTGatewayGatewayStream - Audio mode for Media Transformationshttps://developers.cloudflare.com/changelog/post/2025-07-22-media-transformations-audio-mode/https://developers.cloudflare.com/changelog/post/2025-07-22-media-transformations-audio-mode/<p>We now support <code>audio</code> mode! Use this feature to extract audio from a source video, outputting an M4A file to use in downstream workflows like <a href="https://developers.cloudflare.com/workers-ai/">AI inference</a>, content moderation, or transcription.</p> <p>For example,</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="text"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example URL</span><span class="nb-code-title-lang">text</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="text" data-nb-lang="text"><code><span class="line"><span class="nb-shiki-wvjl67">https://example.com/cdn-cgi/media/&lt;OPTIONS&gt;/&lt;SOURCE-VIDEO&gt;</span></span> <span class="line"><span class="nb-shiki-wvjl67">https://example.com/cdn-cgi/media/mode=audio,time=3s,duration=60s/&lt;input video with diction&gt;</span></span></code></pre></figure> <p>For more information, learn about <a href="https://developers.cloudflare.com/stream/transform-videos/">Transforming Videos</a>.</p>Tue, 22 Jul 2025 00:00:00 GMTStreamStreamCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Virtual Cloudflare One Appliance with KVM support (open beta)https://developers.cloudflare.com/changelog/post/2025-07-21-virtual-appliance-kvm-proxmox/https://developers.cloudflare.com/changelog/post/2025-07-21-virtual-appliance-kvm-proxmox/<p>The KVM-based virtual Cloudflare One Appliance is now in open beta with official support for Proxmox VE.</p> <p>Customers can deploy the virtual appliance on KVM hypervisors to connect branch or data center networks to Cloudflare WAN without dedicated hardware.</p> <p>For setup instructions, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/">Configure a virtual Cloudflare One Appliance</a>.</p>Mon, 21 Jul 2025 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANEmail Service - Subaddressing support in Email Routinghttps://developers.cloudflare.com/changelog/post/2025-07-21-subaddressing/https://developers.cloudflare.com/changelog/post/2025-07-21-subaddressing/<p>Subaddressing, as defined in <a href="https://www.rfc-editor.org/rfc/rfc5233" target="_blank" rel="noopener">RFC 5233<span class="external-link"> ↗</span></a>, also known as plus addressing, is now supported in Email Routing. This enables using the "+" separator to augment your custom addresses with arbitrary detail information.</p> <p>Now you can send an email to <code>user+detail@example.com</code> and it will be captured by the <code>user@example.com</code> custom address. The <code>+detail</code> part is ignored by Email Routing, but it can be captured next in the processing chain in the logs, an <a href="https://developers.cloudflare.com/email-service/api/route-emails/email-handler/">Email Worker</a> or an <a href="https://github.com/cloudflare/agents/tree/main/examples/email-agent" target="_blank" rel="noopener">Agent application<span class="external-link"> ↗</span></a>.</p> <p>Customers can use this feature to dynamically add context to their emails, such as tracking the source of an email or categorizing emails without needing to create multiple custom addresses.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1316,height=678,format=webp/_astro/subaddressing.x65bljxx.png" alt="Subaddressing" loading="lazy" decoding="async" width="1316" height="678"> <p>Check our <a href="https://developers.cloudflare.com/email-service/configuration/email-routing-addresses/#subaddressing">Developer Docs</a> to learn how to enable subaddressing in Email Routing.</p>Mon, 21 Jul 2025 00:00:00 GMTEmail ServiceEmail ServiceWAF - WAF Release - 2025-07-21 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-07-21-emergency/https://developers.cloudflare.com/changelog/post/2025-07-21-emergency/ <p>This week's update highlights several high-impact vulnerabilities affecting Microsoft SharePoint Server. These flaws, involving unsafe deserialization, allow unauthenticated remote code execution over the network, posing a critical threat to enterprise environments relying on SharePoint for collaboration and document management.</p> <p><strong>Key Findings</strong></p> <ul> <li>Microsoft SharePoint Server (CVE-2025-53770): A critical vulnerability involving unsafe deserialization of untrusted data, enabling unauthenticated remote code execution over the network. This flaw allows attackers to execute arbitrary code on vulnerable SharePoint servers without user interaction.</li> <li>Microsoft SharePoint Server (CVE-2025-53771): A closely related deserialization issue that can be exploited by unauthenticated attackers, potentially leading to full system compromise. The vulnerability highlights continued risks around insecure serialization logic in enterprise collaboration platforms.</li> </ul> <p><strong>Impact</strong></p> <p>Together, these vulnerabilities significantly weaken the security posture of on-premise Microsoft SharePoint Server deployments. By enabling remote code execution without authentication, they open the door for attackers to gain persistent access, deploy malware, and move laterally across enterprise environments.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="34dac2b38b904163bc587cc32168f6f0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2168f6f0</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100817</td><td>Microsoft SharePoint - Deserialization - CVE:CVE-2025-53770</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d21f327516a145bc9d1b05678de656c4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8de656c4</span></button></rule-id></td><td>100818</td><td>Microsoft SharePoint - Deserialization - CVE:CVE-2025-53771</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table> <p>For more details, also refer to <a href="https://blog.cloudflare.com/cloudflare-protects-against-critical-sharepoint-vulnerability-cve-2025-53770/" target="_blank" rel="noopener">our blog<span class="external-link"> ↗</span></a>.</p>Mon, 21 Jul 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-07-21https://developers.cloudflare.com/changelog/post/2025-07-21-waf-release/https://developers.cloudflare.com/changelog/post/2025-07-21-waf-release/ <p>This week's update spotlights several critical vulnerabilities across Citrix NetScaler Memory Disclosure, FTP servers and network application. Several flaws enable unauthenticated remote code execution or sensitive data exposure, posing a significant risk to enterprise security.</p> <p><strong>Key Findings</strong></p> <ul> <li>Wing FTP Server (CVE-2025-47812): A critical Remote Code Execution (RCE) vulnerability that enables unauthenticated attackers to execute arbitrary code with root/SYSTEM-level privileges by exploiting a Lua injection flaw.</li> <li>Infoblox NetMRI (CVE-2025-32813): A remote unauthenticated command injection flaw that allows an attacker to execute arbitrary commands, potentially leading to unauthorized access.</li> <li>Citrix Netscaler ADC (CVE-2025-5777, CVE-2023-4966): A sensitive information disclosure vulnerability, also known as "Citrix Bleed2", that allows the disclosure of memory and subsequent remote access session hijacking.</li> <li>Akamai CloudTest (CVE-2025-49493): An XML External Entity (XXE) injection that could lead to read local files on the system by manipulating XML input.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities affect critical enterprise infrastructure, from file transfer services and network management appliances to application delivery controllers. The Wing FTP RCE and Infoblox command injection flaws offer direct paths to deep system compromise, while the Citrix "Bleed2" and Akamai XXE vulnerabilities undermine system integrity by enabling session hijacking and sensitive data theft.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6ab3bd3b58fb4325ac2d3cc73461ec9e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3461ec9e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100804</td><td>BerriAI - SSRF - CVE:CVE-2024-6587</td><td>Log</td><td>Log</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0e17d8761f1a47d5a744a75b5199b58a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5199b58a</span></button></rule-id></td><td>100805</td><td>Wing FTP Server - Remote Code Execution - CVE:CVE-2025-47812</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="81ace5a851214a2f9c58a1e7919a91a4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...919a91a4</span></button></rule-id></td><td>100807</td><td>Infoblox NetMRI - Command Injection - CVE:CVE-2025-32813</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cd8fa74e8f6f476c9380ae217899130f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7899130f</span></button></rule-id></td><td>100808</td><td>Citrix Netscaler ADC - Buffer Error - CVE:CVE-2025-5777</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e012c7bece304a1daf80935ed1cf8e08"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d1cf8e08</span></button></rule-id></td><td>100809</td><td>Citrix Netscaler ADC - Information Disclosure - CVE:CVE-2023-4966</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5d348a573a834ffd968faffc6e70469f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6e70469f</span></button></rule-id></td><td>100810</td><td>Akamai CloudTest - XXE - CVE:CVE-2025-49493</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 21 Jul 2025 00:00:00 GMTWAFWAFSecurity Center - New APIs for Brand Protection setuphttps://developers.cloudflare.com/changelog/post/2025-07-18-brand-protection-api/https://developers.cloudflare.com/changelog/post/2025-07-18-brand-protection-api/<p>The Brand Protection API is now available, allowing users to create new queries and delete existing ones, fetch matches and more!</p> <p>What you can do:</p> <ul> <li><strong>create new string or logo query</strong></li> <li><strong>delete string or logo queries</strong></li> <li><strong>download matches for both logo and string queries</strong></li> <li><strong>read matches for both logo and string queries</strong></li> </ul> <p>Ready to start? Check out the <a href="https://developers.cloudflare.com/api/resources/brand_protection/">Brand Protection API</a> in our documentation.</p>Fri, 18 Jul 2025 00:00:00 GMTSecurity CenterSecurity CenterWorkers - The Cloudflare Vite plugin now supports Vite 7https://developers.cloudflare.com/changelog/post/2025-07-17-vite-plugin-vite-7-support/https://developers.cloudflare.com/changelog/post/2025-07-17-vite-plugin-vite-7-support/<p><a href="https://vite.dev/blog/announcing-vite7" target="_blank" rel="noopener">Vite 7<span class="external-link"> ↗</span></a> is now supported in the Cloudflare Vite plugin. See the <a href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#700-2025-06-24" target="_blank" rel="noopener">Vite changelog<span class="external-link"> ↗</span></a> for a list of changes.</p> <p>Note that the minimum Node.js versions supported by Vite 7 are 20.19 and 22.12. We continue to support Vite 6 so you do not need to immediately upgrade.</p>Thu, 17 Jul 2025 01:00:00 GMTWorkersWorkersData Loss Prevention - New detection entry type: Document Matching for DLPhttps://developers.cloudflare.com/changelog/post/2025-07-17-document-matching/https://developers.cloudflare.com/changelog/post/2025-07-17-document-matching/<p>You can now create <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#document-entries">document-based</a> detection entries in DLP by uploading example documents. Cloudflare will encrypt your documents and create a unique fingerprint of the file. This fingerprint is then used to identify similar documents or snippets within your organization's traffic and stored files.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1356,height=839,format=webp/_astro/document-match.CcN8pGgR.png" alt="DLP" loading="lazy" decoding="async" width="1356" height="839"> <p><strong>Key features and benefits:</strong></p> <ul> <li> <p><strong>Upload documents, forms, or templates:</strong> Easily upload .docx and .txt files (up to 10 MB) that contain sensitive information you want to protect.</p> </li> <li> <p><strong>Granular control with similarity percentage:</strong> Define a minimum similarity percentage (0-100%) that a document must meet to trigger a detection, reducing false positives.</p> </li> <li> <p><strong>Comprehensive coverage:</strong> Apply these document-based detection entries in:</p> <ul> <li> <p><strong>Gateway policies:</strong> To inspect network traffic for sensitive documents as they are uploaded or shared.</p> </li> <li> <p><strong>CASB (Cloud Access Security Broker):</strong> To scan files stored in cloud applications for sensitive documents at rest.</p> </li> </ul> </li> <li> <p><strong>Identify sensitive data:</strong> This new detection entry type is ideal for identifying sensitive data within completed forms, templates, or even small snippets of a larger document, helping you prevent data exfiltration and ensure compliance.</p> </li> </ul> <p>Once uploaded and processed, you can add this new document entry into a DLP profile and policies to enhance your data protection strategy.</p>Thu, 17 Jul 2025 00:00:00 GMTData Loss PreventionData Loss PreventionCloudflare Tunnel, Cloudflare Tunnel for SASE - Faster, more reliable UDP traffic for Cloudflare Tunnelhttps://developers.cloudflare.com/changelog/post/2025-07-15-udp-improvements/https://developers.cloudflare.com/changelog/post/2025-07-15-udp-improvements/ <p>Your real-time applications running over <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a> are now faster and more reliable. We've completely re-architected the way <code>cloudflared</code> proxies UDP traffic in order to isolate it from other traffic, ensuring latency-sensitive applications like private DNS are no longer slowed down by heavy TCP traffic (like file transfers) on the same Tunnel.</p> <p>This is a foundational improvement to Cloudflare Tunnel, delivered automatically to all customers. There are no settings to configure — your UDP traffic is already flowing faster and more reliably.</p> <p><strong>What’s new:</strong></p> <ul> <li><strong>Faster UDP performance</strong>: We've significantly reduced the latency for establishing new UDP sessions, making applications like private DNS much more responsive.</li> <li><strong>Greater reliability for mixed traffic</strong>: UDP packets are no longer affected by heavy TCP traffic, preventing timeouts and connection drops for your real-time services.</li> </ul> <p>Learn more about running <a href="https://developers.cloudflare.com/reference-architecture/architectures/sase/#connecting-applications">TCP or UDP applications</a> and <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/">private networks</a> through <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/">Cloudflare Tunnel</a>.</p>Tue, 15 Jul 2025 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASECloudflare Fundamentals, Terraform - Terraform v5.7.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-07-11-terraform-v5.7.0-provider/https://developers.cloudflare.com/changelog/post/2025-07-11-terraform-v5.7.0-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. We are aware of the high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by the Cloudflare community related to the v5 release, with 13.5% of resources impacted. We have committed to releasing improvements on a 2 week cadeance to ensure it's stability and relability, including the v5.7 release.</p> <p>Thank you for continuing to raise issues and please keep an eye on this changelog for more information about upcoming releases.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Addressed permanent diff bug on Cloudflare Tunnel config</li> <li>State is now saved correctly for Zero Trust Access applications</li> <li>Exact match is now working as expected within <code>data.cloudflare_zero_trust_access_applications</code></li> <li><code>cloudflare_zero_trust_access_policy</code> now supports OIDC claims &amp; diff issues resolved</li> <li>Self hosted applications with private IPs no longer require a public domain for <code>cloudflare_zero_trust_access_application</code>.</li> <li>New resource: <ul> <li><code>cloudflare_zero_trust_tunnel_warp_connector</code></li> </ul> </li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, see the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.7.0" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5563" target="_blank" rel="noopener">#5563: cloudflare_logpull_retention is missing import<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5608" target="_blank" rel="noopener">#5608: cloudflare_zero_trust_access_policy in 5.5.0 provider gives error upon apply unexpected new value: .app_count: was cty.NumberIntVal(0), but now cty.NumberIntVal(1)<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5612" target="_blank" rel="noopener">#5612: data.cloudflare_zero_trust_access_applications does not exact match<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5532" target="_blank" rel="noopener">#5532: cloudflare_zero_trust_access_identity_provider detects changes on every plan<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5662" target="_blank" rel="noopener">#5662: cloudflare_zero_trust_access_policy does not support OIDC claims<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5565" target="_blank" rel="noopener">#5565: Running Terraform with the cloudflare_zero_trust_access_policy resource results in updates on every apply, even when no changes are made - breaks idempotency<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5529" target="_blank" rel="noopener">#5529: cloudflare_zero_trust_access_application: self hosted applications with private ips require public domain <span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new one if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We suggest holding on migration to v5 while we work on stabilization of the v5 provider. This will ensure Cloudflare can work ahead and avoid any blocking issues.</p> <p>If you'd like more information on migrating from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition, although these do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Mon, 14 Jul 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - WAF Release - 2025-07-14https://developers.cloudflare.com/changelog/post/2025-07-14-waf-release/https://developers.cloudflare.com/changelog/post/2025-07-14-waf-release/ <p>This week’s vulnerability analysis highlights emerging web application threats that exploit modern JavaScript behavior and SQL parsing ambiguities. Attackers continue to refine techniques such as attribute overloading and obfuscated logic manipulation to evade detection and compromise front-end and back-end systems.</p> <p><strong>Key Findings</strong></p> <ul> <li>XSS – Attribute Overloading: A novel cross-site scripting technique where attackers abuse custom or non-standard HTML attributes to smuggle payloads into the DOM. These payloads evade traditional sanitization logic, especially in frameworks that loosely validate attributes or trust unknown tokens.</li> <li>XSS – onToggle Event Abuse: Exploits the lesser-used onToggle event (triggered by elements like <code>&lt;details&gt;</code>) to execute arbitrary JavaScript when users interact with UI elements. This vector is often overlooked by static analyzers and can be embedded in seemingly benign components.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities target both user-facing components and back-end databases, introducing potential vectors for credential theft, session hijacking, or full data exfiltration. The XSS variants bypass conventional filters through overlooked HTML behaviors, while the obfuscated SQLi enables attackers to stealthily probe back-end logic, making them especially difficult to detect and block.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a8918353372b4191b10684eb2aa3d845"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2aa3d845</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100798</td><td>XSS - Attribute Overloading</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="31dd299ba375414dac9260c037548d06"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...37548d06</span></button></rule-id></td><td>100799</td><td>XSS - OnToggle</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 14 Jul 2025 00:00:00 GMTWAFWAFCloudflare One - New onboarding guides for Zero Trusthttps://developers.cloudflare.com/changelog/post/2025-07-09-onboarding-resources/https://developers.cloudflare.com/changelog/post/2025-07-09-onboarding-resources/<p>Use our brand new onboarding experience for Cloudflare Zero Trust. New and returning users can now engage with a <strong>Get Started</strong> tab with walkthroughs for setting up common use cases end-to-end.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2048,height=966,format=webp/_astro/zt-onboarding-guides._18EfPbe.png" alt="Zero Trust onboarding guides" loading="lazy" decoding="async" width="2048" height="966"> <p>There are eight brand new onboarding guides in total:</p> <ul> <li>Securely access a private network (sets up device client and Tunnel)</li> <li>Device-to-device / mesh networking (sets up and connects multiple device clients)</li> <li>Network to network connectivity (sets up and connects multiple WARP Connectors, makes reference to Magic WAN availability for Enterprise)</li> <li>Secure web traffic (sets up device client, Gateway, pre-reqs, and initial policies)</li> <li>Secure DNS for networks (sets up a new DNS location and Gateway policies)</li> <li>Clientless web access (sets up Access to a web app, Tunnel, and public hostname)</li> <li>Clientless SSH access (all the same + the web SSH experience)</li> <li>Clientless RDP access (all the same + RDP-in-browser)</li> </ul> <p>Each flow walks the user through the steps to configure the essential elements, and provides a “more details” panel with additional contextual information about what the user will accomplish at the end, along with why the steps they take are important.</p> <p>Try them out now in the <a href="https://one.dash.cloudflare.com/?to=/:account/home" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>!</p>Thu, 10 Jul 2025 00:00:00 GMTCloudflare OneCloudflare OneLog Explorer - Usage trackinghttps://developers.cloudflare.com/changelog/post/2025-07-09-usage-tracking/https://developers.cloudflare.com/changelog/post/2025-07-09-usage-tracking/<p><a href="https://developers.cloudflare.com/log-explorer/">Log Explorer</a> customers can now monitor their data ingestion volume to keep track of their billing. Monthly usage is displayed at the top of the <a href="https://developers.cloudflare.com/log-explorer/log-search/">Log Search</a> and <a href="https://developers.cloudflare.com/log-explorer/manage-datasets/">Manage Datasets</a> screens in Log Explorer.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=418,height=157,format=webp/_astro/ingested-data.D2flqRIu.png" alt="Ingested data" loading="lazy" decoding="async" width="418" height="157">Wed, 09 Jul 2025 00:00:00 GMTLog ExplorerLog ExplorerAI Search - Faster indexing and new Jobs view in AutoRAGhttps://developers.cloudflare.com/changelog/post/2025-07-08-autorag-jobs-view/https://developers.cloudflare.com/changelog/post/2025-07-08-autorag-jobs-view/<p>You can now expect <strong>3-5× faster indexing</strong> in AutoRAG, and with it, a brand new <strong>Jobs view</strong> to help you monitor indexing progress.</p> <p>With each AutoRAG, indexing jobs are automatically triggered to sync your data source (i.e. R2 bucket) with your Vectorize index, ensuring new or updated files are reflected in your query results. You can also trigger jobs manually via the <a href="https://developers.cloudflare.com/api/resources/ai-search/subresources/rags/">Sync API</a> or by clicking “Sync index” in the dashboard.</p> <p>With the new jobs observability, you can now:</p> <ul> <li>View the status, job ID, source, start time, duration and last sync time for each indexing job</li> <li>Inspect real-time logs of job events (e.g. <code>Starting indexing data source...</code>)</li> <li>See a history of past indexing jobs under the Jobs tab of your AutoRAG</li> </ul> <p>This makes it easier to understand what’s happening behind the scenes.</p> <p><strong>Coming soon:</strong> We’re adding APIs to programmatically check indexing status, making it even easier to integrate AutoRAG into your workflows.</p> <p>Try it out today on the <a href="https://dash.cloudflare.com/?to=/:account/ai/autorag" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>.</p>Tue, 08 Jul 2025 00:00:00 GMTAI SearchAI SearchCloudflare Images - HEIC support in Cloudflare Imageshttps://developers.cloudflare.com/changelog/post/heic-support/https://developers.cloudflare.com/changelog/post/heic-support/<p>You can use Images to ingest HEIC images and serve them in supported output formats like AVIF, WebP, JPEG, and PNG.</p> <p>When inputting a HEIC image, dimension and sizing limits may still apply. Refer to our documentation to see limits for <a href="https://developers.cloudflare.com/images/storage/upload-images/methods/">uploading to Images</a> or <a href="https://developers.cloudflare.com/images/optimization/transformations/overview/">transforming a remote image</a>.</p>Tue, 08 Jul 2025 00:00:00 GMTCloudflare ImagesCloudflare ImagesCloudflare One - Cloudy summaries for Access and Gateway Logshttps://developers.cloudflare.com/changelog/post/2025-07-07-cloudy-summaries-access-gateway/https://developers.cloudflare.com/changelog/post/2025-07-07-cloudy-summaries-access-gateway/<p>Cloudy, Cloudflare's AI Agent, will now automatically summarize your <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/access-authentication-logs/">Access</a> and <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/">Gateway</a> block logs.</p> <p>In the log itself, Cloudy will summarize what occurred and why. This will be helpful for quick troubleshooting and issue correlation.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=512,height=472,format=webp/_astro/cloudy-explanation.oFZR6cXa.png" alt="Cloudy AI summarizes a log" loading="lazy" decoding="async" width="512" height="472"> <p>If you have feedback about the Cloudy summary - good or bad - you can provide that right from the summary itself.</p>Mon, 07 Jul 2025 00:00:00 GMTCloudflare OneCloudflare OneCloudflare One - New App Library for Zero Trust Dashboardhttps://developers.cloudflare.com/changelog/post/2025-07-07-dashboard-app-library/https://developers.cloudflare.com/changelog/post/2025-07-07-dashboard-app-library/<p>Cloudflare Zero Trust customers can use the App Library to get full visibility over the SaaS applications that they use in their Gateway policies, CASB integrations, and Access for SaaS applications.</p> <p><strong>App Library</strong>, found under <strong>My Team</strong>, makes information available about all Applications that can be used across the Zero Trust product suite.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1089,height=548,format=webp/_astro/app-library.D403GJ9j.png" alt="Zero Trust App Library" loading="lazy" decoding="async" width="1089" height="548"> <p>You can use the App Library to see:</p> <ul> <li>How Applications are defined</li> <li>Where they are referenced in policies</li> <li>Whether they have Access for SaaS configured</li> <li>Review their CASB findings and integration status.</li> </ul> <p>Within individual Applications, you can also track their usage across your organization, and better understand user behavior.</p>Mon, 07 Jul 2025 00:00:00 GMTCloudflare OneCloudflare OneWAF - Increased IP List Limits for Enterprise Accountshttps://developers.cloudflare.com/changelog/post/2025-07-07-increased-ip-list-limits/https://developers.cloudflare.com/changelog/post/2025-07-07-increased-ip-list-limits/<p>We have significantly increased the limits for <a href="https://developers.cloudflare.com/waf/tools/lists/">IP Lists</a> on Enterprise plans to provide greater flexibility and control:</p> <ul> <li><strong>Total number of lists</strong>: Increased from 10 to 1,000.</li> <li><strong>Total number of list items</strong>: Increased from 10,000 to 500,000.</li> </ul> <p>Limits for other list types and plans remain unchanged. For more details, refer to the <a href="https://developers.cloudflare.com/waf/tools/lists/#availability">lists availability</a>.</p>Mon, 07 Jul 2025 00:00:00 GMTWAFWAFWAF - WAF Release - 2025-07-07https://developers.cloudflare.com/changelog/post/2025-07-07-waf-release/https://developers.cloudflare.com/changelog/post/2025-07-07-waf-release/ <p>This week’s roundup uncovers critical vulnerabilities affecting enterprise VoIP systems, webmail platforms, and a popular JavaScript framework. The risks range from authentication bypass to remote code execution (RCE) and buffer handling flaws, each offering attackers a path to elevate access or fully compromise systems.</p> <p><strong>Key Findings</strong></p> <ul> <li>Next.js - Auth Bypass: A newly detected authentication bypass flaw in the Next.js framework allows attackers to access protected routes or APIs without proper authorization, undermining application access controls.</li> <li>Fortinet FortiVoice (CVE-2025-32756): A buffer error vulnerability in FortiVoice systems that could lead to memory corruption and potential code execution or service disruption in enterprise telephony environments.</li> <li>Roundcube (CVE-2025-49113): A critical RCE flaw allowing unauthenticated attackers to execute arbitrary PHP code via crafted requests, leading to full compromise of mail servers and user inboxes.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities affect core business infrastructure, from web interfaces to voice communications and email platforms. The Roundcube RCE and FortiVoice buffer flaw offer potential for deep system access, while the Next.js auth bypass undermines trust boundaries in modern web apps.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b6558cac8c874bd6878734057eb35ee6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7eb35ee6</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100795</td><td>Next.js - Auth Bypass</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="58fcf6d9c05d4b7a8f41e0a3c329aeb0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c329aeb0</span></button></rule-id></td><td>100796</td><td>Fortinet FortiVoice - Buffer Error - CVE:CVE-2025-32756</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="34ed0624bc864ea88bbea55bab314023"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ab314023</span></button></rule-id></td><td>100797</td><td>Roundcube - Remote Code Execution - CVE:CVE-2025-49113</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 07 Jul 2025 00:00:00 GMTWAFWAFWorkers - Workers now supports JavaScript debug terminals in VSCode, Cursor and Windsurf IDEshttps://developers.cloudflare.com/changelog/post/2025-07-04-javascript-debug-terminals/https://developers.cloudflare.com/changelog/post/2025-07-04-javascript-debug-terminals/<p>Workers now support breakpoint debugging using VSCode's built-in <a href="https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_javascript-debug-terminal" target="_blank" rel="noopener">JavaScript Debug Terminals<span class="external-link"> ↗</span></a>. All you have to do is open a JS debug terminal (<code>Cmd + Shift + P</code> and then type <code>javascript debug</code>) and run <code>wrangler dev</code> (or <code>vite dev</code>) from within the debug terminal. VSCode will automatically connect to your running Worker (even if you're running multiple Workers at once!) and start a debugging session.</p> <p>In 2023 we announced <a href="https://blog.cloudflare.com/debugging-cloudflare-workers/" target="_blank" rel="noopener">breakpoint debugging support<span class="external-link"> ↗</span></a> for Workers, which meant that you could easily debug your Worker code in Wrangler's built-in devtools (accessible via the <code>[d]</code> hotkey) as well as multiple other devtools clients, <a href="https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/" target="_blank" rel="noopener">including VSCode<span class="external-link"> ↗</span></a>. For most developers, breakpoint debugging via VSCode is the most natural flow, but until now it's required <a href="https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/#setup-vs-code-to-use-breakpoints" target="_blank" rel="noopener">manually configuring a <code>launch.json</code> file<span class="external-link"> ↗</span></a>, running <code>wrangler dev</code>, and connecting via VSCode's built-in debugger. Now it's much more seamless!</p>Fri, 04 Jul 2025 00:00:00 GMTWorkersWorkersHyperdrive - Hyperdrive now supports configuring the amount of database connectionshttps://developers.cloudflare.com/changelog/post/2025-07-02-hyperdrive-configurable-connection-count/https://developers.cloudflare.com/changelog/post/2025-07-02-hyperdrive-configurable-connection-count/<p>You can now specify the number of connections your Hyperdrive configuration uses to connect to your origin database.</p> <p>All configurations have a minimum of 5 connections. The maximum connection count for a Hyperdrive configuration depends on the <a href="https://developers.cloudflare.com/hyperdrive/platform/limits/">Hyperdrive limits of your Workers plan</a>.</p> <p>This feature allows you to right-size your connection pool based on your database capacity and application requirements. You can configure connection counts through the Cloudflare dashboard or API.</p> <p>Refer to the <a href="https://developers.cloudflare.com/hyperdrive/concepts/connection-pooling/">Hyperdrive configuration documentation</a> for more information.</p>Thu, 03 Jul 2025 00:00:00 GMTHyperdriveHyperdriveAccess - Access RDP securely from your browser — now in open betahttps://developers.cloudflare.com/changelog/post/2025-07-01-browser-based-rdp-open-beta/https://developers.cloudflare.com/changelog/post/2025-07-01-browser-based-rdp-open-beta/<p><a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/">Browser-based RDP</a> with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/">Cloudflare Access</a> is now available in open beta for all Cloudflare customers. It enables secure, remote Windows server access without VPNs or RDP clients.</p> <p>With browser-based RDP, you can:</p> <ul> <li><strong>Control how users authenticate to internal RDP resources</strong> with single sign-on (SSO), multi-factor authentication (MFA), and granular access policies.</li> <li><strong>Record who is accessing which servers and when</strong> to support regulatory compliance requirements and to gain greater visibility in the event of a security event.</li> <li><strong>Eliminate the need to install and manage software on user devices</strong>. You will only need a web browser.</li> <li><strong>Reduce your attack surface</strong> by keeping your RDP servers off the public Internet and protecting them from common threats like credential stuffing or brute-force attacks.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2132,height=1814,format=webp/_astro/browser-based-rdp-access-app.BNXce1JL.png" alt="Example of a browsed-based RDP Access application" loading="lazy" decoding="async" width="2132" height="1814"> <p>To get started, see <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/">Connect to RDP in a browser</a>.</p>Tue, 01 Jul 2025 00:00:00 GMTAccessAccessAI Crawl Control - Introducing Pay Per Crawl (private beta)https://developers.cloudflare.com/changelog/post/2025-07-01-pay-per-crawl/https://developers.cloudflare.com/changelog/post/2025-07-01-pay-per-crawl/<p>We are introducing a new feature of <a href="https://developers.cloudflare.com/ai-crawl-control/">AI Crawl Control</a> — Pay Per Crawl. <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/what-is-pay-per-crawl/">Pay Per Crawl</a> enables site owners to require payment from AI crawlers every time the crawlers access their content, thereby fostering a fairer Internet by enabling site owners to control and monetize how their content gets used by AI.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2926,height=1516,format=webp/_astro/pay-per-crawl.B5bv2nwT.png" alt="Pay per crawl" loading="lazy" decoding="async" width="2926" height="1516"> <p><strong>For Site Owners:</strong></p> <ul> <li>Set pricing and select which crawlers to charge for content access</li> <li>Manage payments via Stripe</li> <li>Monitor analytics on successful content deliveries</li> </ul> <p><strong>For AI Crawler Owners:</strong></p> <ul> <li>Use HTTP headers to request and accept pricing</li> <li>Receive clear confirmations on charges for accessed content</li> </ul> <p>Learn more in the <a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/what-is-pay-per-crawl/">Pay Per Crawl documentation</a>.</p>Tue, 01 Jul 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlAI Crawl Control - AI Crawl Control refreshhttps://developers.cloudflare.com/changelog/post/2025-07-01-refresh/https://developers.cloudflare.com/changelog/post/2025-07-01-refresh/<p>We redesigned the AI Crawl Control dashboard to provide more intuitive and granular control over AI crawlers.</p> <ul> <li>From the new <strong>AI Crawlers</strong> tab: block specific AI crawlers.</li> <li>From the new <strong>Metrics</strong> tab: view AI Crawl Control metrics.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1323,height=798,format=webp/_astro/manage-ai-crawlers.6UgS8dSG.png" alt="Block AI crawlers" loading="lazy" decoding="async" width="1323" height="798"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1694,height=834,format=webp/_astro/analyze-metrics.C52pJZVg.png" alt="Analyze AI crawler activity" loading="lazy" decoding="async" width="1694" height="834"> <p>To get started, explore:</p> <ul> <li><a href="https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/">Manage AI crawlers</a>.</li> <li><a href="https://developers.cloudflare.com/ai-crawl-control/features/analyze-ai-traffic/">Analyze AI traffic</a>.</li> </ul>Tue, 01 Jul 2025 00:00:00 GMTAI Crawl ControlAI Crawl ControlRadar - Bot & Crawler Insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-07-01-radar-bots-insights/https://developers.cloudflare.com/changelog/post/2025-07-01-radar-bots-insights/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="web-crawlers-insights">Web crawlers insights</h4><a class="anchor-link" href="#web-crawlers-insights"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> now offers expanded insights into web crawlers, giving you greater visibility into aggregated trends in crawl and refer activity.</p> <p>We have introduced the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/subresources/web_crawlers/methods/summary/"><code>/bots/crawlers/summary/{dimension}</code></a>: Returns an overview of crawler HTTP request distributions across key dimensions.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/subresources/web_crawlers/methods/timeseries_groups/"><code>/bots/crawlers/timeseries_groups/{dimension}</code></a>: Provides time-series data on crawler request distributions across the same dimensions.</li> </ul> <p>These endpoints allow analysis across the following dimensions:</p> <ul> <li><code>user_agent</code>: Parsed data from the <code>User-Agent</code> header.</li> <li><code>referer</code>: Parsed data from the <code>Referer</code> header.</li> <li><code>crawl_refer_ratio</code>: Ratio of HTML page crawl requests to HTML page referrals by platform.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="broader-bot-insights">Broader bot insights</h4><a class="anchor-link" href="#broader-bot-insights"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>In addition to crawler-specific insights, Radar now provides a broader set of bot endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/"><code>/bots/</code></a>: Lists all bots.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/methods/get/"><code>/bots/{bot_slug}</code></a>: Returns detailed metadata for a specific bot.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/methods/timeseries/"><code>/bots/timeseries</code></a>: Time-series data for bot activity.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/methods/summary/"><code>/bots/summary/{dimension}</code></a>: Returns an overview of bot HTTP request distributions across key dimensions.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/bots/methods/timeseries_groups/"><code>/bots/timeseries_groups/{dimension}</code></a>: Provides time-series data on bot request distributions across the same dimensions.</li> </ul> <p>These endpoints support filtering and breakdowns by:</p> <ul> <li><code>bot</code>: Bot name.</li> <li><code>bot_operator</code>: The organization or entity operating the bot.</li> <li><code>bot_category</code>: Classification of bot type.</li> </ul> <p>The previously available <code>verified_bots</code> endpoints have now been deprecated in favor of this set of bot insights APIs. While current data still focuses on verified bots, we plan to expand support for unverified bot traffic in the future.</p> <p>Learn more about the new Radar bot and crawler insights in our <a href="https://blog.cloudflare.com/ai-search-crawl-refer-ratio-on-radar" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Tue, 01 Jul 2025 00:00:00 GMTRadarRadarWorkers - Enhanced support for static assets with the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-07-01-vite-plugin-enhanced-assets-support/https://developers.cloudflare.com/changelog/post/2025-07-01-vite-plugin-enhanced-assets-support/<p>You can now use any of Vite's <a href="https://vite.dev/guide/assets" target="_blank" rel="noopener">static asset handling<span class="external-link"> ↗</span></a> features in your Worker as well as in your frontend. These include importing assets as URLs, importing as strings and importing from the <code>public</code> directory as well as inlining assets.</p> <p>Additionally, assets imported as URLs in your Worker are now automatically moved to the client build output.</p> <p>Here is an example that fetches an imported asset using the <a href="https://developers.cloudflare.com/workers/static-assets/binding/#binding">assets binding</a> and modifies the response.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// Import the asset URL</span></span> <span class="line"><span class="nb-shiki-21nrsd">// This returns the resolved path in development and production</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> myImage </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./my-image.png"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Fetch the asset using the binding</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">ASSETS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(myImage, request.url));</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Create a new `Response` object that can be modified</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> modifiedResponse</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(response.body, response);</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Add an additional header</span></span> <span class="line"><span class="nb-shiki-140thh"> modifiedResponse.headers.</span><span class="nb-shiki-1t8gfj">append</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-header"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"imported-asset"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Return the modified response</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> modifiedResponse;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/workers/vite-plugin/reference/static-assets/">Static Assets</a> in the Cloudflare Vite plugin docs for more info.</p>Tue, 01 Jul 2025 00:00:00 GMTWorkersWorkersCloudflare One Client - Cloudflare One Agent for Android (version 2.4.2)https://developers.cloudflare.com/changelog/post/2025-06-30-warp-ga-android/https://developers.cloudflare.com/changelog/post/2025-06-30-warp-ga-android/<p>A new GA release for the Android Cloudflare One Agent is now available in the <a href="https://play.google.com/store/apps/details?id=com.cloudflare.cloudflareoneagent" target="_blank" rel="noopener">Google Play Store<span class="external-link"> ↗</span></a>. This release contains improvements and new exciting features, including <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#enable_post_quantum">post-quantum cryptography</a>. By tunneling your corporate network traffic over Cloudflare, you can now gain the immediate <a href="https://blog.cloudflare.com/pq-2024/" target="_blank" rel="noopener">protection of post-quantum cryptography<span class="external-link"> ↗</span></a> without needing to upgrade any of your individual corporate applications or systems.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>QLogs are now disabled by default and can be enabled in the app by turning on <strong>Enable qlogs</strong> under <strong>Settings</strong> &gt; <strong>Advanced</strong> &gt; <strong>Diagnostics</strong> &gt; <strong>Debug Logs</strong>. The QLog setting from previous releases will no longer be respected.</li> <li>DNS over HTTPS traffic is now included in the WARP tunnel by default.</li> <li>The WARP client now applies <a href="https://blog.cloudflare.com/pq-2024/" target="_blank" rel="noopener">post-quantum cryptography<span class="external-link"> ↗</span></a> end-to-end on enabled devices accessing resources behind a Cloudflare Tunnel. This feature can be enabled by <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#enable_post_quantum">MDM</a>.</li> <li>Fixed an issue that caused WARP connection failures on ChromeOS devices.</li> </ul>Mon, 30 Jun 2025 00:00:00 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Agent for iOS (version 1.11)https://developers.cloudflare.com/changelog/post/2025-06-30-warp-ga-ios/https://developers.cloudflare.com/changelog/post/2025-06-30-warp-ga-ios/<p>A new GA release for the iOS Cloudflare One Agent is now available in the <a href="https://apps.apple.com/us/app/cloudflare-one-agent/id6443476492" target="_blank" rel="noopener">iOS App Store<span class="external-link"> ↗</span></a>. This release contains improvements and new exciting features, including <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#enable_post_quantum">post-quantum cryptography</a>. By tunneling your corporate network traffic over Cloudflare, you can now gain the immediate <a href="https://blog.cloudflare.com/pq-2024/" target="_blank" rel="noopener">protection of post-quantum cryptography<span class="external-link"> ↗</span></a> without needing to upgrade any of your individual corporate applications or systems.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>QLogs are now disabled by default and can be enabled in the app by turning on <strong>Enable qlogs</strong> under <strong>Settings</strong> &gt; <strong>Advanced</strong> &gt; <strong>Diagnostics</strong> &gt; <strong>Debug Logs</strong>. The QLog setting from previous releases will no longer be respected.</li> <li>DNS over HTTPS traffic is now included in the WARP tunnel by default.</li> <li>The WARP client now applies <a href="https://blog.cloudflare.com/pq-2024/" target="_blank" rel="noopener">post-quantum cryptography<span class="external-link"> ↗</span></a> end-to-end on enabled devices accessing resources behind a Cloudflare Tunnel. This feature can be enabled by <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#enable_post_quantum">MDM</a>.</li> </ul>Mon, 30 Jun 2025 00:00:00 GMTCloudflare One ClientCloudflare One ClientEmail Service - Mail authentication requirements for Email Routinghttps://developers.cloudflare.com/changelog/post/2025-06-30-mail-authentication/https://developers.cloudflare.com/changelog/post/2025-06-30-mail-authentication/<p>The Email Routing platform supports <a href="https://datatracker.ietf.org/doc/html/rfc7208" target="_blank" rel="noopener">SPF<span class="external-link"> ↗</span></a> records and <a href="https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail" target="_blank" rel="noopener">DKIM (DomainKeys Identified Mail)<span class="external-link"> ↗</span></a> signatures and honors these protocols when the sending domain has them configured. However, if the sending domain doesn't implement them, we still forward the emails to upstream mailbox providers.</p> <p>Starting on July 3, 2025, we will require all emails to be authenticated using at least one of the protocols, SPF or DKIM, to forward them. We also strongly recommend that all senders implement the DMARC protocol.</p> <p>If you are using a Worker with an Email trigger to receive email messages and forward them upstream, you will need to handle the case where the forward action may fail due to missing authentication on the incoming email.</p> <p>SPAM has been a long-standing issue with email. By enforcing mail authentication, we will increase the efficiency of identifying abusive senders and blocking bad emails. If you're an email server delivering emails to large mailbox providers, it's likely you already use these protocols; otherwise, please ensure you have them properly configured.</p>Mon, 30 Jun 2025 00:00:00 GMTEmail ServiceEmail ServiceMagic Transit - Graceful withdrawal of BYOIP prefixeshttps://developers.cloudflare.com/changelog/post/2025-06-30-graceful-byoip-withdrawal/https://developers.cloudflare.com/changelog/post/2025-06-30-graceful-byoip-withdrawal/<p>Magic Transit customers can now configure AS prepending on their BYOIP prefixes advertised at the Cloudflare edge. This allows for smoother traffic migration and minimizes packet loss when changing providers.</p> <p>AS prepending makes the Cloudflare route less preferred by increasing the AS path length. You can use this to gradually shift traffic away from Cloudflare before withdrawing a prefix, avoiding abrupt routing changes.</p> <p>Prepending can be configured via the API or through BGP community values when peering with the Magic Transit routing table. For more information, refer to <a href="https://developers.cloudflare.com/magic-transit/how-to/advertise-prefixes/">Advertise prefixes</a>.</p>Mon, 30 Jun 2025 00:00:00 GMTMagic TransitMagic TransitWorkers - Remote bindings (beta) now works with Next.js — connect to remote resources (D1, KV, R2, etc.) during local developmenthttps://developers.cloudflare.com/changelog/post/2025-06-25-getPlatformProxy-support-remote-bindings/https://developers.cloudflare.com/changelog/post/2025-06-25-getPlatformProxy-support-remote-bindings/ <p>We <a href="https://github.com/cloudflare/workers-sdk/discussions/9660" target="_blank" rel="noopener">recently announced<span class="external-link"> ↗</span></a> our public beta for <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">remote bindings</a>, which allow you to connect to deployed resources running on your Cloudflare account (like <a href="https://developers.cloudflare.com/r2">R2 buckets</a> or <a href="https://developers.cloudflare.com/d1">D1 databases</a>) while running a local development session.</p> <p>Now, you can use remote bindings with your Next.js applications through the <a href="https://opennext.js.org/cloudflare/bindings#remote-bindings" target="_blank" rel="noopener"><code>@opennextjs/cloudflare</code> adaptor<span class="external-link"> ↗</span></a> by enabling the experimental feature in your <code>next.config.ts</code>:</p> <figure class="nb-code-figure" data-nb-lang="diff"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="diff" data-nb-lang="diff"><code><span class="line"><span class="nb-shiki-ycghdz"><span style="user-select: none;">-</span> initOpenNextCloudflareForDev();</span></span> <span class="line"><span class="nb-shiki-17hn0y"><span style="user-select: none;">+</span> initOpenNextCloudflareForDev({</span></span> <span class="line"><span class="nb-shiki-17hn0y"><span style="user-select: none;">+</span> experimental: { remoteBindings: true }</span></span> <span class="line"><span class="nb-shiki-17hn0y"><span style="user-select: none;">+</span> });</span></span></code></pre></figure> <p>Then, all you have to do is specify which bindings you want connected to the deployed resource on your Cloudflare account via the <code>experimental_remote</code> flag in your binding definition:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "r2_buckets"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bucket_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"testing-bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_BUCKET"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "experimental_remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">r2_buckets</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">bucket_name = </span><span class="nb-shiki-mdbnqw">"testing-bucket"</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"MY_BUCKET"</span></span> <span class="line"><span class="nb-shiki-140thh">experimental_remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>You can then run <code>next dev</code> to start a local development session (or start a preview with <code>opennextjs-cloudflare preview</code>), and all requests to <code>env.MY_BUCKET</code> will be proxied to the remote <code>testing-bucket</code> — rather than the <a href="https://developers.cloudflare.com/workers/local-development/#bindings-during-local-development">default local binding simulations</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="remote-bindings--isr">Remote bindings &amp; ISR</h4><a class="anchor-link" href="#remote-bindings--isr"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Remote bindings are also used during the build process, which comes with significant benefits for pages using <a href="https://opennext.js.org/aws/inner_workings/components/server/node#isrssg" target="_blank" rel="noopener">Incremental Static Regeneration (ISR)<span class="external-link"> ↗</span></a>. During the build step for an ISR page, your server executes the page's code just as it would for normal user requests. If a page needs data to display (like fetching user info from <a href="https://developers.cloudflare.com/kv">KV</a>), those requests are actually made. The server then uses this fetched data to render the final HTML.</p> <p>Data fetching is a critical part of this process, as the finished HTML is only as good as the data it was built with. If the build process can't fetch real data, you end up with a pre-rendered page that's empty or incomplete.</p> <p><strong>With remote bindings support in OpenNext,</strong> your pre-rendered pages are built with real data from the start. The build process uses any configured remote bindings, and any data fetching occurs against the deployed resources on your Cloudflare account.</p> <p><strong>Want to learn more?</strong> Get started with <a href="https://opennext.js.org/cloudflare/bindings#remote-bindings" target="_blank" rel="noopener">remote bindings and OpenNext<span class="external-link"> ↗</span></a>.</p> <p><strong>Have feedback?</strong> Join the discussion in our <a href="https://github.com/cloudflare/workers-sdk/discussions/9660" target="_blank" rel="noopener">beta announcement<span class="external-link"> ↗</span></a> to share feedback or report any issues.</p>Mon, 30 Jun 2025 00:00:00 GMTWorkersWorkersWorkers - Run and connect Workers in separate dev commands with the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-06-26-vite-plugin-cross-commands-binding/https://developers.cloudflare.com/changelog/post/2025-06-26-vite-plugin-cross-commands-binding/<p>Workers can now talk to each other across separate dev commands using service bindings and tail consumers, whether started with <code>vite dev</code> or <code>wrangler dev</code>.</p> <p>Simply start each Worker in its own terminal:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Terminal 1</span></span> <span class="line"><span class="nb-shiki-1t8gfj">vite</span><span class="nb-shiki-mdbnqw"> dev</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Terminal 2</span></span> <span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> dev</span></span></code></pre></figure> <p>This is useful when different teams maintain different Workers, or when each Worker has its own build setup or tooling.</p> <p>Check out the <a href="https://developers.cloudflare.com/workers/local-development/multi-workers">Developing with multiple Workers</a> guide to learn more about the different approaches and when to use each one.</p>Thu, 26 Jun 2025 00:00:00 GMTWorkersWorkersAgents, Workers, Workflows - Run AI-generated code on-demand with Code Sandboxes (new)https://developers.cloudflare.com/changelog/post/2025-06-24-announcing-sandboxes/https://developers.cloudflare.com/changelog/post/2025-06-24-announcing-sandboxes/<p>AI is supercharging app development for everyone, but we need a safe way to run untrusted, LLM-written code. We’re introducing <a href="https://www.npmjs.com/package/@cloudflare/sandbox" target="_blank" rel="noopener">Sandboxes<span class="external-link"> ↗</span></a>, which let your Worker run actual processes in a secure, container-based environment.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { getSandbox } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-140thh"> { Sandbox } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/sandbox"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> sandbox</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> getSandbox</span><span class="nb-shiki-140thh">(env.Sandbox, </span><span class="nb-shiki-mdbnqw">"my-sandbox"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> sandbox.</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"ls"</span><span class="nb-shiki-140thh">, [</span><span class="nb-shiki-mdbnqw">"-la"</span><span class="nb-shiki-140thh">]);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="methods">Methods</h4><a class="anchor-link" href="#methods"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><code>exec(command: string, args: string[], options?: { stream?: boolean })</code>:Execute a command in the sandbox.</li> <li><code>gitCheckout(repoUrl: string, options: { branch?: string; targetDir?: string; stream?: boolean })</code>: Checkout a git repository in the sandbox.</li> <li><code>mkdir(path: string, options: { recursive?: boolean; stream?: boolean })</code>: Create a directory in the sandbox.</li> <li><code>writeFile(path: string, content: string, options: { encoding?: string; stream?: boolean })</code>: Write content to a file in the sandbox.</li> <li><code>readFile(path: string, options: { encoding?: string; stream?: boolean })</code>: Read content from a file in the sandbox.</li> <li><code>deleteFile(path: string, options?: { stream?: boolean })</code>: Delete a file from the sandbox.</li> <li><code>renameFile(oldPath: string, newPath: string, options?: { stream?: boolean })</code>: Rename a file in the sandbox.</li> <li><code>moveFile(sourcePath: string, destinationPath: string, options?: { stream?: boolean })</code>: Move a file from one location to another in the sandbox.</li> <li><code>ping()</code>: Ping the sandbox.</li> </ul> <p>Sandboxes are still experimental. We're using them to explore how isolated, container-like workloads might scale on Cloudflare — and to help define the developer experience around them.</p> <p>You can try it today from your Worker, with just a few lines of code. Let us know what you build.</p>Wed, 25 Jun 2025 00:00:00 GMTAgentsAgentsWorkersWorkflowsDurable Objects, Workers - @cloudflare/actors library - SDK for Durable Objects in betahttps://developers.cloudflare.com/changelog/post/2025-06-25-actors-package-alpha/https://developers.cloudflare.com/changelog/post/2025-06-25-actors-package-alpha/<p>The new <a href="https://www.npmjs.com/package/@cloudflare/actors" target="_blank" rel="noopener">@cloudflare/actors<span class="external-link"> ↗</span></a> library is now in beta!</p> <p>The <code>@cloudflare/actors</code> library is a new SDK for Durable Objects and provides a powerful set of abstractions for building real-time, interactive, and multiplayer applications on top of Durable Objects. With beta usage and feedback, <code>@cloudflare/actors</code> will become the recommended way to build on Durable Objects and draws upon Cloudflare's experience building products/features on Durable Objects.</p> <p>The name "actors" originates from the <a href="https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/#actor-programming-model">actor programming model</a>, which closely ties to how Durable Objects are modelled.</p> <p>The <code>@cloudflare/actors</code> library includes:</p> <ul> <li>Storage helpers for querying embeddeded, per-object SQLite storage</li> <li>Storage helpers for managing SQL schema migrations</li> <li>Alarm helpers for scheduling multiple alarms provided a date, delay in seconds, or cron expression</li> <li><code>Actor</code> class for using Durable Objects with a defined pattern</li> <li>Durable Objects <a href="https://developers.cloudflare.com/durable-objects/api/base/" target="_blank" rel="noopener">Workers API<span class="external-link"> ↗</span></a> is always available for your application as needed</li> </ul> <p>Storage and alarm helper methods can be combined with <a href="https://github.com/cloudflare/actors?tab=readme-ov-file#storage--alarms-with-durableobject-class" target="_blank" rel="noopener">any Javascript class<span class="external-link"> ↗</span></a> that defines your Durable Object, i.e, ones that extend <code>DurableObject</code> including the <code>Actor</code> class.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Storage } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/actors/storage"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> ChatRoom</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> storage</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Storage</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> constructor</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> DurableObjectState</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> super</span><span class="nb-shiki-140thh">(ctx, env)</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.storage </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Storage</span><span class="nb-shiki-140thh">(ctx.storage);</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.storage.migrations </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> [{</span></span> <span class="line"><span class="nb-shiki-140thh"> idMonotonicInc: </span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Create users table"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> sql: </span><span class="nb-shiki-mdbnqw">"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY)"</span></span> <span class="line"><span class="nb-shiki-140thh"> }]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Run migrations before executing SQL query</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.storage.</span><span class="nb-shiki-1t8gfj">runMigrations</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Query with SQL template</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> userId </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url).searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"userId"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> query</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.storage.</span><span class="nb-shiki-1t8gfj">sql</span><span class="nb-shiki-mdbnqw">`SELECT * FROM users WHERE id = ${</span><span class="nb-shiki-140thh">userId</span><span class="nb-shiki-mdbnqw">};`</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`${</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-mdbnqw">(</span><span class="nb-shiki-140thh">query</span><span class="nb-shiki-mdbnqw">)</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p><code>@cloudflare/actors</code> library introduces the <code>Actor</code> class pattern. <code>Actor</code> lets you access Durable Objects without writing the Worker that communicates with your Durable Object (the Worker is created for you). By default, requests are routed to a Durable Object named "default".</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyActor</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Actor</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'Hello, World!'</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> handler</span><span class="nb-shiki-140thh">(MyActor);</span></span></code></pre></figure> <p>You can <a href="https://developers.cloudflare.com/durable-objects/get-started/#3-instantiate-and-communicate-with-a-durable-object">route</a> to different Durable Objects by name within your <code>Actor</code> class using <a href="https://github.com/cloudflare/actors?tab=readme-ov-file#actor-with-custom-name" target="_blank" rel="noopener"><code>nameFromRequest</code><span class="external-link"> ↗</span></a>.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyActor</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Actor</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> static</span><span class="nb-shiki-1t8gfj"> nameFromRequest</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> url </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> url.searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"userId"</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> "foo"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Actor identifier (Durable Object name): ${</span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">identifier</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> handler</span><span class="nb-shiki-140thh">(MyActor);</span></span></code></pre></figure> <p>For more examples, check out the library <a href="https://github.com/cloudflare/actors?tab=readme-ov-file#getting-started" target="_blank" rel="noopener">README<span class="external-link"> ↗</span></a>. <code>@cloudflare/actors</code> library is a place for more helpers and built-in patterns, like retry handling and Websocket-based applications, to reduce development overhead for common Durable Objects functionality. Please share feedback and what more you would like to see on our <a href="https://discord.com/channels/595317990191398933/773219443911819284" target="_blank" rel="noopener">Discord channel<span class="external-link"> ↗</span></a>.</p>Wed, 25 Jun 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersData Loss Prevention, CASB, Cloudflare One - Data Security Analytics in the Zero Trust dashboardhttps://developers.cloudflare.com/changelog/post/cf1-data-security-analytics-v1/https://developers.cloudflare.com/changelog/post/cf1-data-security-analytics-v1/<p>Zero Trust now includes <strong>Data security analytics</strong>, providing you with unprecedented visibility into your organization sensitive data.</p> <p>The new dashboard includes:</p> <ul> <li> <p><strong>Sensitive Data Movement Over Time:</strong></p> <ul> <li>See patterns and trends in how sensitive data moves across your environment. This helps understand where data is flowing and identify common paths.</li> </ul> </li> <li> <p><strong>Sensitive Data at Rest in SaaS &amp; Cloud:</strong></p> <ul> <li>View an inventory of sensitive data stored within your corporate SaaS applications (for example, Google Drive, Microsoft 365) and cloud accounts (such as AWS S3).</li> </ul> </li> <li> <p><strong>DLP Policy Activity:</strong></p> <ul> <li>Identify which of your Data Loss Prevention (DLP) policies are being triggered most often.</li> <li>See which specific users are responsible for triggering DLP policies.</li> </ul> </li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3254,height=1580,format=webp/_astro/cf1-data-security-analytics-v1.BGl6fYXl.png" alt="Data Security Analytics" loading="lazy" decoding="async" width="3254" height="1580"> <p>To access the new dashboard, log in to <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare One<span class="external-link"> ↗</span></a> and go to <strong>Insights</strong> on the sidebar.</p>Mon, 23 Jun 2025 09:00:00 GMTData Loss PreventionData Loss PreventionCASBCloudflare OneCloudflare Fundamentals - Cloudflare User Groups & SCIM User Groups are now in GAhttps://developers.cloudflare.com/changelog/post/2025-06-23-user-groups-ga/https://developers.cloudflare.com/changelog/post/2025-06-23-user-groups-ga/<p>We're announcing the GA of <strong>User Groups for Cloudflare Dashboard</strong> and <strong>System for Cross Domain Identity Management (SCIM) User Groups</strong>, strengthening our RBAC capabilities with stable, production-ready primitives for managing access at scale.</p> <p><strong>What's New</strong></p> <p><strong>User Groups [GA]</strong>: <a href="https://developers.cloudflare.com/fundamentals/manage-members/user-groups/">User Groups</a> are a new Cloudflare IAM primitive that enable administrators to create collections of account members that are treated equally from an access control perspective. User Groups can be assigned permission policies, with individual members in the group inheriting all permissions granted to the User Group. User Groups can be created manually or via our APIs.</p> <p><strong>SCIM User Groups [GA]</strong>: Centralize &amp; simplify your user and group management at scale by syncing memberships directly from your upstream identity provider (like Okta or Entra ID) to the Cloudflare Platform. This ensures Cloudflare stays in sync with your identity provider, letting you apply Permission Policies to those synced groups directly within the Cloudflare Dashboard.</p> <p><strong>Stability &amp; Scale</strong>: These features have undergone extensive testing during the Public Beta period and are now ready for production use across enterprises of all sizes.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>SCIM Virtual Groups (identified by the pattern <code>CF-&lt;accountID&gt;-&lt;Role Name&gt;</code> in your IdP) are now officially deprecated as of June 2, 2025. SCIM Virtual Groups end-of-life will take effect on December 2, 2025. We strongly recommend migrating to SCIM User Groups to ensure continued support for SCIM synchronization to the Cloudflare Dashboard. If you haven’t used Virtual Groups, no action is required.</p></div></div></aside> <p>For more info:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/user-groups/">Get started with User Groups</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/">Explore our SCIM integration guide</a></li> </ul>Mon, 23 Jun 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsNetwork Interconnect - CNI maintenance alertshttps://developers.cloudflare.com/changelog/post/2025-06-20-cni-maintenance-alerts/https://developers.cloudflare.com/changelog/post/2025-06-20-cni-maintenance-alerts/<p>Customers using Cloudflare Network Interconnect with the v1 dataplane can now subscribe to maintenance alert emails. These alerts notify you of planned maintenance windows that may affect your CNI circuits.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/network-interconnect/monitoring-and-alerts/">Monitoring and alerts</a>.</p>Fri, 20 Jun 2025 00:00:00 GMTNetwork InterconnectNetwork InterconnectWorkers - Increased blob size limits in Workers Analytics Enginehttps://developers.cloudflare.com/changelog/post/2025-06-20-increased-blob-size-limits-in-Workers-Analytics/https://developers.cloudflare.com/changelog/post/2025-06-20-increased-blob-size-limits-in-Workers-Analytics/ <p>We’ve increased the total allowed size of <a href="https://developers.cloudflare.com/analytics/analytics-engine/get-started/#2-write-data-points-from-your-worker"><code>blob</code></a> fields on data points written to <a href="https://developers.cloudflare.com/analytics/analytics-engine/">Workers Analytics Engine</a> from <strong>5 KB to 16 KB</strong>.</p> <p>This change gives you more flexibility when logging rich observability data — such as base64-encoded payloads, AI inference traces, or custom metadata — without hitting request size limits.</p> <p>You can find full details on limits for queries, filters, payloads, and more <a href="https://developers.cloudflare.com/analytics/analytics-engine/limits/">here in the Workers Analytics Engine limits documentation</a>.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> env.analyticsDataset.</span><span class="nb-shiki-1t8gfj">writeDataPoint</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The sum of all of the blob's sizes can now be 16 KB</span></span> <span class="line"><span class="nb-shiki-140thh"> blobs: [</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The URL of the request to the Worker</span></span> <span class="line"><span class="nb-shiki-140thh"> request.url,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Some metadata about your application you'd like to store</span></span> <span class="line"><span class="nb-shiki-dzsirb"> JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">(metadata),</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The version of your Worker this datapoint was collected from</span></span> <span class="line"><span class="nb-shiki-140thh"> env.versionMetadata.tag,</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> indexes: [</span><span class="nb-shiki-mdbnqw">"sample-index"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">worker.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> env.analyticsDataset.</span><span class="nb-shiki-1t8gfj">writeDataPoint</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The sum of all of the blob's sizes can now be 16 KB</span></span> <span class="line"><span class="nb-shiki-140thh"> blobs: [</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The URL of the request to the Worker</span></span> <span class="line"><span class="nb-shiki-140thh"> request.url,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Some metadata about your application you'd like to store</span></span> <span class="line"><span class="nb-shiki-dzsirb"> JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">(metadata),</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // The version of your Worker this datapoint was collected from</span></span> <span class="line"><span class="nb-shiki-140thh"> env.versionMetadata.tag,</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> indexes: [</span><span class="nb-shiki-mdbnqw">"sample-index"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div>Fri, 20 Jun 2025 00:00:00 GMTWorkersWorkersAI Search - View custom metadata in responses and guide AI-search with context in AutoRAGhttps://developers.cloudflare.com/changelog/post/2025-06-19-autorag-custom-metadata-and-context/https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-custom-metadata-and-context/<p>In <a href="https://developers.cloudflare.com/ai-search/">AutoRAG</a>, you can now view your object's custom metadata in the response from <a href="https://developers.cloudflare.com/ai-search/api/search/workers-binding/"><code>/search</code></a> and <a href="https://developers.cloudflare.com/ai-search/api/search/workers-binding/"><code>/ai-search</code></a>, and optionally add a <code>context</code> field in the custom metadata of an object to provide additional guidance for AI-generated answers.</p> <p>You can add <a href="https://developers.cloudflare.com/r2/api/workers/workers-api-reference/#r2putoptions">custom metadata</a> to an object when uploading it to your R2 bucket.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="objects-custom-metadata-in-search-responses">Object's custom metadata in search responses</h4><a class="anchor-link" href="#objects-custom-metadata-in-search-responses"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you run a search, AutoRAG now returns any custom metadata associated with the object. This metadata appears in the response inside <code>attributes</code> then <code>file</code> , and can be used for downstream processing.</p> <p>For example, the <code>attributes</code> section of your search response may look like:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "attributes"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "timestamp"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">1750001460000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "folder"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"docs/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "filename"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"launch-checklist.md"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "file"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "url"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"https://wiki.company.com/docs/launch-checklist"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "context"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"A checklist for internal launch readiness, including legal, engineering, and marketing steps."</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="add-a-context-field-to-guide-llm-answers">Add a <code>context</code> field to guide LLM answers</h4><a class="anchor-link" href="#add-a-context-field-to-guide-llm-answers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you include a custom metadata field named <code>context</code>, AutoRAG attaches that value to each chunk of the file. When you run an <code>/ai-search</code> query, this <code>context</code> is passed to the LLM and can be used as additional input when generating an answer.</p> <p>We recommend using the <code>context</code> field to describe supplemental information you want the LLM to consider, such as a summary of the document or a source URL. If you have several different metadata attributes, you can join them together however you choose within the <code>context</code> string.</p> <p>For example:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "context"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"summary: 'Checklist for internal product launch readiness, including legal, engineering, and marketing steps.'; url: 'https://wiki.company.com/docs/launch-checklist'"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>This gives you more control over how your content is interpreted, without requiring you to modify the original contents of the file.</p> <p>Learn more in AutoRAG's <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/">metadata filtering documentation</a>.</p>Thu, 19 Jun 2025 00:00:00 GMTAI SearchAI SearchAI Search - Filter your AutoRAG search by file namehttps://developers.cloudflare.com/changelog/post/2025-06-19-autorag-filename-filter/https://developers.cloudflare.com/changelog/post/2025-06-19-autorag-filename-filter/<p>In <a href="https://developers.cloudflare.com/ai-search/">AutoRAG</a>, you can now <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/">filter</a> by an object's file name using the <code>filename</code> attribute, giving you more control over which files are searched for a given query.</p> <p>This is useful when your application has already determined which files should be searched. For example, you might query a PostgreSQL database to get a list of files a user has access to based on their permissions, and then use that list to limit what AutoRAG retrieves.</p> <p>For example, your search query may look like:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">autorag</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-autorag"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> query: </span><span class="nb-shiki-mdbnqw">"what is the project deadline?"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> filters: {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"eq"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> key: </span><span class="nb-shiki-mdbnqw">"filename"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> value: </span><span class="nb-shiki-mdbnqw">"project-alpha-roadmap.md"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>This allows you to connect your application logic with AutoRAG's retrieval process, making it easy to control what gets searched without needing to reindex or modify your data.</p> <p>Learn more in AutoRAG's <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/">metadata filtering documentation</a>.</p>Thu, 19 Jun 2025 00:00:00 GMTAI SearchAI SearchDNS - Account-level DNS analytics now available via GraphQL Analytics APIhttps://developers.cloudflare.com/changelog/post/2025-06-23-account-level-dns-analytics-api/https://developers.cloudflare.com/changelog/post/2025-06-23-account-level-dns-analytics-api/<p>Authoritative DNS analytics are now available on the <strong>account level</strong> via the <a href="https://developers.cloudflare.com/analytics/graphql-api/">Cloudflare GraphQL Analytics API</a>.</p> <p>This allows users to query DNS analytics across multiple zones in their account, by using the <code>accounts</code> filter.</p> <p>Here is an example to retrieve the most recent DNS queries across all zones in your account that resulted in an <code>NXDOMAIN</code> response over a given time frame. Please replace <code>a30f822fcd7c401984bf85d8f2a5111c</code> with your actual account ID.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="graphql"><figcaption class="nb-code-title"><span class="nb-code-title-name">GraphQL example for account-level DNS analytics</span><span class="nb-code-title-lang">graphql</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="graphql" data-nb-lang="graphql"><code><span class="line"><span class="nb-shiki-1itgoe">query</span><span class="nb-shiki-1t8gfj"> GetLatestNXDOMAINResponses</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> viewer</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> accounts</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">filter</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-mdbnqw">accountTag</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"a30f822fcd7c401984bf85d8f2a5111c"</span><span class="nb-shiki-140thh"> }) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> dnsAnalyticsAdaptive</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> filter</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> date_geq</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-06-16"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> date_leq</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-06-18"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> responseCode</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"NXDOMAIN"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-1jdh33"> limit</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">10000</span></span> <span class="line"><span class="nb-shiki-1jdh33"> orderBy</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-dzsirb">datetime_DESC</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> ) {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> zoneTag</span></span> <span class="line"><span class="nb-shiki-1jdh33"> queryName</span></span> <span class="line"><span class="nb-shiki-1jdh33"> responseCode</span></span> <span class="line"><span class="nb-shiki-1jdh33"> queryType</span></span> <span class="line"><span class="nb-shiki-1jdh33"> datetime</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/dns/additional-options/analytics/#analytics">DNS Analytics documentation</a>.</p>Thu, 19 Jun 2025 00:00:00 GMTDNSDNSD1, Workers, Workers for Platforms - Automate Worker deployments with a simplified SDK and more reliable Terraform providerhttps://developers.cloudflare.com/changelog/post/2025-06-17-workers-terraform-sdk-api-fixes/https://developers.cloudflare.com/changelog/post/2025-06-17-workers-terraform-sdk-api-fixes/ <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="simplified-worker-deployments-with-our-sdks">Simplified Worker Deployments with our SDKs</h4><a class="anchor-link" href="#simplified-worker-deployments-with-our-sdks"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've simplified the programmatic deployment of Workers via our <a href="https://developers.cloudflare.com/fundamentals/api/reference/sdks/">Cloudflare SDKs</a>. This update abstracts away the low-level complexities of the <code>multipart/form-data</code> upload process, allowing you to focus on your code while we handle the deployment mechanics.</p> <p>This new interface is available in:</p> <ul> <li><a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener">cloudflare-typescript<span class="external-link"> ↗</span></a> (4.4.1)</li> <li><a href="https://github.com/cloudflare/cloudflare-python" target="_blank" rel="noopener">cloudflare-python<span class="external-link"> ↗</span></a> (4.3.1)</li> </ul> <p>For complete examples, see our guide on <a href="https://developers.cloudflare.com/workers/platform/infrastructure-as-code">programmatic Worker deployments</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="the-old-way-manual-api-calls">The Old way: Manual API calls</h4><a class="anchor-link" href="#the-old-way-manual-api-calls"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously, deploying a Worker programmatically required manually constructing a <code>multipart/form-data</code> HTTP request, packaging your code and a separate <code>metadata.json</code> file. This was more complicated and verbose, and prone to formatting errors.</p> <p>For example, here's how you would upload a Worker script previously with cURL:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/accounts/</span><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-mdbnqw">account_i</span><span class="nb-shiki-140thh">d</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-mdbnqw">/workers/scripts/my-hello-world-script</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> PUT</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;api_token&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'metadata={</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "main_module": "my-hello-world-script.mjs",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "bindings": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "plain_text",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "name": "MESSAGE",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "text": "Hello World!"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ],</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "compatibility_date": "$today"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> };type=application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -F</span><span class="nb-shiki-mdbnqw"> 'my-hello-world-script.mjs=@-;filename=my-hello-world-script.mjs;type=application/javascript+module'</span><span class="nb-shiki-1itgoe"> &lt;&lt;</span><span class="nb-shiki-mdbnqw">EOF</span></span> <span class="line"><span class="nb-shiki-mdbnqw">export default {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> async fetch(request, env, ctx) {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> return new Response(env.MESSAGE, { status: 200 });</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw">};</span></span> <span class="line"><span class="nb-shiki-mdbnqw">EOF</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="after-sdk-interface">After: SDK interface</h4><a class="anchor-link" href="#after-sdk-interface"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>With the new SDK interface, you can now define your entire Worker configuration using a single, structured object.</p> <p>This approach allows you to specify metadata like <code>main_module</code>, <code>bindings</code>, and <code>compatibility_date</code> as clearer properties directly alongside your script content. Our SDK takes this logical object and automatically constructs the complex multipart/form-data API request behind the scenes.</p> <p>Here's how you can now programmatically deploy a Worker via the <a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener"><code>cloudflare-typescript</code> SDK<span class="external-link"> ↗</span></a></p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Cloudflare </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { toFile } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare/index"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// ... client setup, script content, etc.</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> script</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.workers.scripts.</span><span class="nb-shiki-1t8gfj">update</span><span class="nb-shiki-140thh">(scriptName, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: accountID,</span></span> <span class="line"><span class="nb-shiki-140thh"> metadata: {</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module: scriptFileName,</span></span> <span class="line"><span class="nb-shiki-140thh"> bindings: [],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> files: {</span></span> <span class="line"><span class="nb-shiki-140thh"> [scriptFileName]: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> toFile</span><span class="nb-shiki-140thh">(Buffer.</span><span class="nb-shiki-1t8gfj">from</span><span class="nb-shiki-140thh">(scriptContent), scriptFileName, {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"application/javascript+module"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> Cloudflare </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> 'cloudflare'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { toFile } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> 'cloudflare/index'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// ... client setup, script content, etc.</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> script</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.workers.scripts.</span><span class="nb-shiki-1t8gfj">update</span><span class="nb-shiki-140thh">(scriptName, {</span></span> <span class="line"><span class="nb-shiki-140thh"> account_id: accountID,</span></span> <span class="line"><span class="nb-shiki-140thh"> metadata: {</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module: scriptFileName,</span></span> <span class="line"><span class="nb-shiki-140thh"> bindings: [],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> files: {</span></span> <span class="line"><span class="nb-shiki-140thh"> [scriptFileName]: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> toFile</span><span class="nb-shiki-140thh">(Buffer.</span><span class="nb-shiki-1t8gfj">from</span><span class="nb-shiki-140thh">(scriptContent), scriptFileName, {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">'application/javascript+module'</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>View the complete example here: <a href="https://github.com/cloudflare/cloudflare-typescript/blob/main/examples/workers/script-upload.ts" target="_blank" rel="noopener">https://github.com/cloudflare/cloudflare-typescript/blob/main/examples/workers/script-upload.ts<span class="external-link"> ↗</span></a></p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="terraform-provider-improvements">Terraform provider improvements</h4><a class="anchor-link" href="#terraform-provider-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've also made several fixes and enhancements to the <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">Cloudflare Terraform provider<span class="external-link"> ↗</span></a>:</p> <ul> <li>Fixed the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script" target="_blank" rel="noopener"><code>cloudflare_workers_script</code><span class="external-link"> ↗</span></a> resource in Terraform, which previously was producing a diff even when there were no changes. Now, your <code>terraform plan</code> outputs will be cleaner and more reliable.</li> <li>Fixed the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_for_platforms_dispatch_namespace" target="_blank" rel="noopener"><code>cloudflare_workers_for_platforms_dispatch_namespace</code><span class="external-link"> ↗</span></a>, where the provider would attempt to recreate the namespace on a <code>terraform apply</code>. The resource now correctly reads its remote state, ensuring stability for production environments and CI/CD workflows.</li> <li>The <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_route" target="_blank" rel="noopener"><code>cloudflare_workers_route</code><span class="external-link"> ↗</span></a> resource now allows for the <code>script</code> property to be empty, null, or omitted to indicate that pattern should be negated for all scripts (see routes <a href="https://developers.cloudflare.com/workers/configuration/routing/routes">docs</a>). You can now reserve a pattern or temporarily disable a Worker on a route without deleting the route definition itself.</li> <li>Using <code>primary_location_hint</code> in the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/d1_database" target="_blank" rel="noopener"><code>cloudflare_d1_database</code><span class="external-link"> ↗</span></a> resource will no longer always try to recreate. You can now safely change the location hint for a D1 database without causing a destructive operation.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="api-improvements">API improvements</h4><a class="anchor-link" href="#api-improvements"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've also properly documented the <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/script_and_version_settings">Workers Script And Version Settings</a> in our public OpenAPI spec and SDKs.</p>Thu, 19 Jun 2025 00:00:00 GMTD1D1WorkersWorkers for PlatformsGateway - Gateway will now evaluate Network policies before HTTP policies from July 14th, 2025https://developers.cloudflare.com/changelog/post/2025-06-17-new-order-of-enforcement/https://developers.cloudflare.com/changelog/post/2025-06-17-new-order-of-enforcement/<p><a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway</a> will now evaluate <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/">Network (Layer 4) policies</a> <strong>before</strong> <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/">HTTP (Layer 7) policies</a>. This change preserves your existing security posture and does not affect which traffic is filtered — but it may impact how notifications are displayed to end users.</p> <p>This change will roll out progressively between <strong>July 14–18, 2025</strong>. If you use HTTP policies, we recommend reviewing your configuration ahead of rollout to ensure the user experience remains consistent.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updated-order-of-enforcement">Updated order of enforcement</h4><a class="anchor-link" href="#updated-order-of-enforcement"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Previous order:</strong></p> <ol> <li>DNS policies</li> <li>HTTP policies</li> <li>Network policies</li> </ol> <p><strong>New order:</strong></p> <ol> <li>DNS policies</li> <li><strong>Network policies</strong></li> <li><strong>HTTP policies</strong></li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="action-required-review-your-gateway-http-policies">Action required: Review your Gateway HTTP policies</h4><a class="anchor-link" href="#action-required-review-your-gateway-http-policies"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This change may affect block notifications. For example:</p> <ul> <li>You have an <strong>HTTP policy</strong> to block <code>example.com</code> and display a block page.</li> <li>You also have a <strong>Network policy</strong> to block <code>example.com</code> silently (no client notification).</li> </ul> <p>With the new order, the Network policy will trigger first — and the user will no longer see the HTTP block page.</p> <p>To ensure users still receive a block notification, you can:</p> <ul> <li>Add a client notification to your Network policy, or</li> <li>Use only the HTTP policy for that domain.</li> </ul> <hr> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="why-were-making-this-change">Why we’re making this change</h4><a class="anchor-link" href="#why-were-making-this-change"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This update is based on user feedback and aims to:</p> <ul> <li>Create a more intuitive model by evaluating network-level policies before application-level policies.</li> <li>Minimize <a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/error-526/#error-526-in-the-zero-trust-context">526 connection errors</a> by verifying the network path to an origin before attempting to establish a decrypted TLS connection.</li> </ul> <hr> <p>To learn more, visit the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/order-of-enforcement/">Gateway order of enforcement documentation</a>.</p>Wed, 18 Jun 2025 00:00:00 GMTGatewayGatewayLog Explorer - Log Explorer is GAhttps://developers.cloudflare.com/changelog/post/2025-06-18-log-explorer-ga/https://developers.cloudflare.com/changelog/post/2025-06-18-log-explorer-ga/<p><a href="https://developers.cloudflare.com/log-explorer/">Log Explorer</a> is now GA, providing native observability and forensics for traffic flowing through Cloudflare.</p> <p>Search and analyze your logs, natively in the Cloudflare dashboard. These logs are also stored in Cloudflare's network, eliminating many of the costs associated with other log providers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=512,height=208,format=webp/_astro/log-explorer-dash.CJSVLZ7Y.png" alt="Log Explorer dashboard" loading="lazy" decoding="async" width="512" height="208"> <p>With Log Explorer, you can now:</p> <ul> <li><strong>Monitor security and performance issues with custom dashboards</strong> – use natural language to define charts for measuring response time, error rates, top statistics and more.</li> <li><strong>Investigate and troubleshoot issues with Log Search</strong> – use data type-aware search filters or custom sql to investigate detailed logs.</li> <li><strong>Save time and collaborate with saved queries</strong> – save Log Search queries for repeated use or sharing with other users in your account.</li> <li><strong>Access Log Explorer at the account and zone level</strong> – easily find Log Explorer at the account and zone level for querying any dataset.</li> </ul> <p>For help getting started, refer to <a href="https://developers.cloudflare.com/log-explorer/">our documentation</a>.</p>Wed, 18 Jun 2025 00:00:00 GMTLog ExplorerLog ExplorerWorkers - Remote bindings public beta - Connect to remote resources (D1, KV, R2, etc.) during local developmenthttps://developers.cloudflare.com/changelog/post/2025-06-18-remote-bindings-beta/https://developers.cloudflare.com/changelog/post/2025-06-18-remote-bindings-beta/ <p>Today <a href="https://github.com/cloudflare/workers-sdk/discussions/9660" target="_blank" rel="noopener">we announced the public beta<span class="external-link"> ↗</span></a> of <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">remote bindings</a> for local development. With remote bindings, you can now connect to deployed resources like <a href="https://developers.cloudflare.com/r2/">R2 buckets</a> and <a href="https://developers.cloudflare.com/d1/">D1 databases</a> while running Worker code on your local machine. This means you can test your local code changes against real data and services, without the overhead of deploying for each iteration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-configuration">Example configuration</h4><a class="anchor-link" href="#example-configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To enable remote mode, add <code>"experimental_remote" : true</code> to each binding that you want to rely on a remote resource running on Cloudflare:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> "r2_buckets"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bucket_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"screenshots-bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"screenshots_bucket"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "experimental_remote"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-worker"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">r2_buckets</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">bucket_name = </span><span class="nb-shiki-mdbnqw">"screenshots-bucket"</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"screenshots_bucket"</span></span> <span class="line"><span class="nb-shiki-140thh">experimental_remote = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>When remote bindings are configured, your Worker <strong>still executes locally</strong>, but all binding calls are proxied to the deployed resource that runs on Cloudflare's network.</p> <p><strong>You can try out remote bindings for local development today with:</strong></p> <ul> <li><a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">Wrangler v4.20.3</a>: Use the <code>wrangler dev --x-remote-bindings</code> command.</li> <li>The <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">Cloudflare Vite Plugin</a>: Refer to the documentation for how to enable in your Vite config.</li> <li>The <a href="https://developers.cloudflare.com/workers/local-development/#remote-bindings">Cloudflare Vitest Plugin</a>: Refer to the documentation for how to enable in your Vitest config.</li> </ul> <p><strong>Have feedback?</strong> Join the discussion in our <a href="https://github.com/cloudflare/workers-sdk/discussions/9660" target="_blank" rel="noopener">beta announcement<span class="external-link"> ↗</span></a> to share feedback or report any issues.</p>Wed, 18 Jun 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Terraform - Terraform v5.6.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-06-17-terraform-v5.6.0-provider/https://developers.cloudflare.com/changelog/post/2025-06-17-terraform-v5.6.0-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. Unlike the earlier Terraform providers, v5 is automatically generated based on the OpenAPI Schemas for our REST APIs. Since launch, we have seen an unexpectedly high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by customers. These issues currently impact about 15% of resources. We have been working diligently to address these issues across the company, and have released the v5.6.0 release which includes a number of bug fixes. Please keep an eye on this changelog for more information about upcoming releases.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Broad fixes across resources with recurring diffs, including, but not limited to: <ul> <li><code>cloudflare_zero_trust_access_identity_provider</code> <ul> <li><code>cloudflare_zone</code></li> </ul> </li> </ul> </li> <li><code>cloudflare_page_rules</code> runtime panic when setting <code>cache_level</code> to <code>cache_ttl_by_status</code></li> <li>Failure to serialize requests in <code>cloudflare_zero_trust_tunnel_cloudflared_config</code></li> <li>Undocumented field 'priority' on <code>zone_lockdown</code> resource</li> <li>Missing importability for <code>cloudflare_zero_trust_device_default_profile_local_domain_fallback</code> and <code>cloudflare_account_subscription</code></li> <li>New resources: <ul> <li><code>cloudflare_schema_validation_operation_settings</code></li> <li><code>cloudflare_schema_validation_schemas</code></li> <li><code>cloudflare_schema_validation_settings</code></li> <li><code>cloudflare_zero_trust_device_settings</code></li> </ul> </li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, see the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.6.0" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5098" target="_blank" rel="noopener">#5098: 500 Server Error on updating 'zero_trust_tunnel_cloudflared_virtual_network' Terraform resource<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5148" target="_blank" rel="noopener">#5148: cloudflare_user_agent_blocking_rule doesn’t actually support user agents<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5472" target="_blank" rel="noopener">#5472: cloudflare_zone showing changes in plan after following upgrade steps<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5508" target="_blank" rel="noopener">#5508: cloudflare_zero_trust_tunnel_cloudflared_config failed to serialize http request<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5509" target="_blank" rel="noopener">#5509: cloudflare_zone: Problematic Terraform behaviour with paused zones<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5520" target="_blank" rel="noopener">#5520: Resource 'cloudflare_magic_wan_static_route' is not working<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5524" target="_blank" rel="noopener">#5524: Optional fields cause crash in cloudflare_zero_trust_tunnel_cloudflared(s) when left null<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5526" target="_blank" rel="noopener">#5526: Provider v5 migration issue: no import method for cloudflare_zero_trust_device_default_profile_local_domain_fallback<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5532" target="_blank" rel="noopener">#5532: cloudflare_zero_trust_access_identity_provider detects changes on every plan<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5561" target="_blank" rel="noopener">#5561: cloudflare_zero_trust_tunnel_cloudflared: cannot rotate tunnel secret<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5569" target="_blank" rel="noopener">#5569: cloudflare_zero_trust_device_custom_profile_local_domain_fallback not allowing multiple DNS Server entries<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5577" target="_blank" rel="noopener">#5577: Panic modifying page_rule resource<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5653" target="_blank" rel="noopener">#5653: cloudflare_zone_setting resource schema confusion in 5.5.0: value vs enabled<span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new one if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are evaluating a move from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition, although these do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Tue, 17 Jun 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers - Control which routes invoke your Worker script for Single Page Applicationshttps://developers.cloudflare.com/changelog/post/2025-06-17-advanced-routing/https://developers.cloudflare.com/changelog/post/2025-06-17-advanced-routing/ <p>For those building <a href="https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/#advanced-routing-control">Single Page Applications (SPAs) on Workers</a>, you can now explicitly define which routes invoke your Worker script in Wrangler configuration. The <a href="https://developers.cloudflare.com/workers/static-assets/binding/#run_worker_first"><code>run_worker_first</code> config option</a> has now been expanded to accept an array of route patterns, allowing you to more granularly specify when your Worker script runs.</p> <p><strong>Configuration example:</strong></p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-spa-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set this to today's date</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "main"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./src/index.ts"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "assets"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "directory"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"./dist/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "not_found_handling"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"single-page-application"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"ASSETS"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "run_worker_first"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"/api/*"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"!/api/docs/*"</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"my-spa-worker"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Set this to today's date</span></span> <span class="line"><span class="nb-shiki-140thh">compatibility_date = </span><span class="nb-shiki-mdbnqw">"2026-08-14"</span></span> <span class="line"><span class="nb-shiki-140thh">main = </span><span class="nb-shiki-mdbnqw">"./src/index.ts"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">assets</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">directory = </span><span class="nb-shiki-mdbnqw">"./dist/"</span></span> <span class="line"><span class="nb-shiki-140thh">not_found_handling = </span><span class="nb-shiki-mdbnqw">"single-page-application"</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"ASSETS"</span></span> <span class="line"><span class="nb-shiki-140thh">run_worker_first = [ </span><span class="nb-shiki-mdbnqw">"/api/*"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"!/api/docs/*"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>This new routing control was done in partnership with our community and customers who provided great feedback on <a href="https://github.com/cloudflare/workers-sdk/discussions/9143" target="_blank" rel="noopener">our public proposal<span class="external-link"> ↗</span></a>. Thank you to everyone who brought forward use-cases and feedback on the design!</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="prerequisites">Prerequisites</h4><a class="anchor-link" href="#prerequisites"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To use advanced routing control with <code>run_worker_first</code>, you'll need:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/wrangler/install-and-update/">Wrangler</a> v4.20.0 and above</li> <li><a href="https://developers.cloudflare.com/workers/vite-plugin/get-started/">Cloudflare Vite plugin</a> v1.7.0 and above</li> </ul>Tue, 17 Jun 2025 00:00:00 GMTWorkersWorkersWorkers - SSRF vulnerability in @opennextjs/cloudflare proactively mitigated for all Cloudflare customershttps://developers.cloudflare.com/changelog/post/2025-06-17-open-next-ssrf/https://developers.cloudflare.com/changelog/post/2025-06-17-open-next-ssrf/<p>Mitigations have been put in place for all existing and future deployments of sites with the Cloudflare adapter for Open Next in response to an identified Server-Side Request Forgery (SSRF) vulnerability in the <code>@opennextjs/cloudflare</code> package.</p> <p>The vulnerability stemmed from an unimplemented feature in the Cloudflare adapter for Open Next, which allowed users to proxy arbitrary remote content via the <code>/_next/image</code> endpoint.</p> <p>This issue allowed attackers to load remote resources from arbitrary hosts under the victim site's domain for any site deployed using the Cloudflare adapter for Open Next. For example: <code>https://victim-site.com/_next/image?url=https://attacker.com</code>. In this example, attacker-controlled content from <code>attacker.com</code> is served through the victim site's domain (<code>victim-site.com</code>), violating the same-origin policy and potentially misleading users or other services.</p> <p>References: <a href="https://www.cve.org/cverecord?id=CVE-2025-6087" target="_blank" rel="noopener">https://www.cve.org/cverecord?id=CVE-2025-6087<span class="external-link"> ↗</span></a>, <a href="https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m" target="_blank" rel="noopener">https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m<span class="external-link"> ↗</span></a></p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="impact">Impact</h4><a class="anchor-link" href="#impact"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>SSRF via unrestricted remote URL loading</li> <li>Arbitrary remote content loading</li> <li>Potential internal service exposure or phishing risks through domain abuse</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="mitigation">Mitigation</h4><a class="anchor-link" href="#mitigation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following mitigations have been put in place:</p> <p><strong>Server side updates</strong> to Cloudflare's platform to restrict the content loaded via the <code>/_next/image</code> endpoint to images. The update automatically mitigates the issue for all existing and any future sites deployed to Cloudflare using the affected version of the Cloudflare adapter for Open Next</p> <p><strong>Root cause fix:</strong> Pull request <a href="https://github.com/opennextjs/opennextjs-cloudflare/pull/727" target="_blank" rel="noopener">#727<span class="external-link"> ↗</span></a> to the Cloudflare adapter for Open Next. The patched version of the adapter has been released as <code>@opennextjs/cloudflare@1.3.0</code></p> <p><strong>Package dependency update:</strong> Pull request <a href="https://github.com/cloudflare/workers-sdk/pull/9608" target="_blank" rel="noopener">cloudflare/workers-sdk#9608<span class="external-link"> ↗</span></a> to create-cloudflare (c3) to use the fixed version of the Cloudflare adapter for Open Next. The patched version of create-cloudflare has been published as <code>create-cloudflare@2.49.3</code>.</p> <p>In addition to the automatic mitigation deployed on Cloudflare's platform, we encourage affected users to upgrade to <code>@opennext/cloudflare</code> v1.3.0 and use the <a href="https://nextjs.org/docs/pages/api-reference/components/image#remotepatterns" target="_blank" rel="noopener"><code>remotePatterns</code><span class="external-link"> ↗</span></a> filter in Next config if they need to allow-list external urls with images assets.</p>Tue, 17 Jun 2025 00:00:00 GMTWorkersWorkersDNS - Internal DNS (beta) now manageable in the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-06-16-internal-dns-beta-ui/https://developers.cloudflare.com/changelog/post/2025-06-16-internal-dns-beta-ui/<p>Participating beta testers can now fully configure <a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS</a> directly in the <a href="https://dash.cloudflare.com/?to=/:account/internal-dns" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="internal-dns-enables-customers-to">Internal DNS enables customers to:</h4><a class="anchor-link" href="#internal-dns-enables-customers-to"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li> <p>Map internal hostnames to private IPs for services, devices, and applications not exposed to the public Internet</p> </li> <li> <p>Resolve internal DNS queries securely through <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Cloudflare Gateway</a></p> </li> <li> <p>Use split-horizon DNS to return different responses based on network context</p> </li> <li> <p>Consolidate internal and public DNS zones within a single management platform</p> </li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-new-in-this-release">What’s new in this release:</h4><a class="anchor-link" href="#whats-new-in-this-release"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Beta participants can now create and manage internal zones and views in the Cloudflare dashboard</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2364,height=1320,format=webp/_astro/internal-dns-beta-ui.B5uCVZ9o.png" alt="Internal DNS UI" loading="lazy" decoding="async" width="2364" height="1320"><aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>The Internal DNS beta is currently only available to Enterprise customers.</p></div></div></aside> <p>To learn more and get started, refer to the <a href="https://developers.cloudflare.com/dns/internal-dns/">Internal DNS documentation</a>.</p>Mon, 16 Jun 2025 00:00:00 GMTDNSDNSWAF - WAF Release - 2025-06-16https://developers.cloudflare.com/changelog/post/2025-06-16-waf-release/https://developers.cloudflare.com/changelog/post/2025-06-16-waf-release/ <p>This week’s roundup highlights multiple critical vulnerabilities across popular web frameworks, plugins, and enterprise platforms. The focus lies on remote code execution (RCE), server-side request forgery (SSRF), and insecure file upload vectors that enable full system compromise or data exfiltration.</p> <p><strong>Key Findings</strong></p> <ul> <li>Cisco IOS XE (CVE-2025-20188): Critical RCE vulnerability enabling unauthenticated attackers to execute arbitrary commands on network infrastructure devices, risking total router compromise.</li> <li>Axios (CVE-2024-39338): SSRF flaw impacting server-side request control, allowing attackers to manipulate internal service requests when misconfigured with unsanitized user input.</li> <li>vBulletin (CVE-2025-48827, CVE-2025-48828): Two high-impact RCE flaws enabling attackers to remotely execute PHP code, compromising forum installations and underlying web servers.</li> <li>Invision Community (CVE-2025-47916): A critical RCE vulnerability allowing authenticated attackers to run arbitrary code in community platforms, threatening data and lateral movement risk.</li> <li>CrushFTP (CVE-2025-32102, CVE-2025-32103): SSRF vulnerabilities in upload endpoint processing permit attackers to pivot internal network scans and abuse internal services.</li> <li>Roundcube (CVE-2025-49113): RCE via email processing enables attackers to execute code upon viewing a crafted email — particularly dangerous for webmail deployments.</li> <li>WooCommerce WordPress Plugin (CVE-2025-47577): Dangerous file upload vulnerability permits unauthenticated users to upload executable payloads, leading to full WordPress site takeover.</li> <li>Cross-Site Scripting (XSS) Detection Improvements: Enhanced detection patterns.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities span core systems — from routers to e-commerce to email. RCE in Cisco IOS XE, Roundcube, and vBulletin poses full system compromise. SSRF in Axios and CrushFTP supports internal pivoting, while WooCommerce’s file upload bug opens doors to mass WordPress exploitation.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="233bcf0ce50f400989a7e44a35fefd53"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...35fefd53</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100783</td><td>Cisco IOS XE - Remote Code Execution - CVE:CVE-2025-20188</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9284e3b1586341acb4591bfd8332af5d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8332af5d</span></button></rule-id></td><td>100784</td><td>Axios - SSRF - CVE:CVE-2024-39338</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2672b175a25548aa8e0107b12e1648d2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2e1648d2</span></button></rule-id></td><td>100785</td><td><p>vBulletin - Remote Code Execution - CVE:CVE-2025-48827, CVE:CVE-2025-48828</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="b77a19fb053744b49eacdab00edcf1ef"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0edcf1ef</span></button></rule-id></td><td>100786</td><td>Invision Community - Remote Code Execution - CVE:CVE-2025-47916</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="aec2274743064523a9667248d6f5eb48"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d6f5eb48</span></button></rule-id></td><td>100791</td><td>CrushFTP - SSRF - CVE:CVE-2025-32102, CVE:CVE-2025-32103</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7b80e1f5575d4d99bb7d56ae30baa18a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...30baa18a</span></button></rule-id></td><td>100792</td><td>Roundcube - Remote Code Execution - CVE:CVE-2025-49113</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="52d76f9394494b0382c7cb00229ba236"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...229ba236</span></button></rule-id></td><td>100793</td><td>XSS - Ontoggle</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d38e657bd43f4d809c28157dfa338296"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fa338296</span></button></rule-id></td><td>100794</td><td><p>WordPress WooCommerce Plugin - Dangerous File Upload - CVE:CVE-2025-47577</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 16 Jun 2025 00:00:00 GMTWAFWAFWorkers - Grant account members read-only access to the Workers Platformhttps://developers.cloudflare.com/changelog/post/2025-06-16-workers-platform-admin-role/https://developers.cloudflare.com/changelog/post/2025-06-16-workers-platform-admin-role/<p>You can now grant members of your Cloudflare account read-only access to the Workers Platform.</p> <p>The new "Workers Platform (Read-only)" role grants read-only access to all products typically used as part of Cloudflare's Developer Platform, including <a href="https://developers.cloudflare.com/workers/">Workers</a>, <a href="https://developers.cloudflare.com/pages/">Pages</a>, <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>, <a href="https://developers.cloudflare.com/kv/">KV</a>, <a href="https://developers.cloudflare.com/r2/">R2</a>, Zones, <a href="https://developers.cloudflare.com/analytics/account-and-zone-analytics/zone-analytics/">Zone Analytics</a> and <a href="https://developers.cloudflare.com/rules/">Page Rules</a>. When Cloudflare introduces new products to the Workers platform, we will add additional read-only permissions to this role.</p> <p>Additionally, the role previously named "Workers Admin" has been renamed to "Workers Platform Admin". This change ensures that the name more accurately reflects the permissions granted — this role has always granted access to more than just Workers — it grants read and write access to the products mentioned above, and similarly, as new products are added to the Workers platform, we will add additional read and write permissions to this role.</p> <p>You can review the updated roles in the <a href="https://developers.cloudflare.com/fundamentals/manage-members/roles/">developer docs</a>.</p>Mon, 16 Jun 2025 00:00:00 GMTWorkersWorkersDNS - NSEC3 support for DNSSEChttps://developers.cloudflare.com/changelog/post/2025-06-11-nsec3-support/https://developers.cloudflare.com/changelog/post/2025-06-11-nsec3-support/<p>Enterprise customers can now select NSEC3 as method for proof of non-existence on their zones.</p> <p>What's new:</p> <ul> <li> <p><strong>NSEC3 support for live-signed zones</strong> – For both primary and secondary zones that are configured to be live-signed (also known as "on-the-fly signing"), NSEC3 can now be selected as proof of non-existence.</p> </li> <li> <p><strong>NSEC3 support for pre-signed zones</strong> – Secondary zones that are transferred to Cloudflare in a <a href="https://developers.cloudflare.com/dns/zone-setups/zone-transfers/cloudflare-as-secondary/dnssec-for-secondary/#set-up-pre-signed-dnssec">pre-signed setup</a> now also support NSEC3 as proof of non-existence.</p> </li> </ul> <p>For more information and how to enable NSEC3, refer to the <a href="https://developers.cloudflare.com/dns/dnssec/enable-nsec3/">NSEC3 documentation</a>.</p>Wed, 11 Jun 2025 00:00:00 GMTDNSDNSStream - Increased limits for Media Transformationshttps://developers.cloudflare.com/changelog/post/2025-06-10-media-transformations-limits-increase/https://developers.cloudflare.com/changelog/post/2025-06-10-media-transformations-limits-increase/<p>We have increased the limits for <a href="https://developers.cloudflare.com/stream/transform-videos/">Media Transformations</a>:</p> <ul> <li>Input file size limit is now 100MB (was 40MB)</li> <li>Output video duration limit is now 1 minute (was 30 seconds)</li> </ul> <p>Additionally, we have improved caching of the input asset, resulting in fewer requests to origin storage even when transformation options may differ.</p> <p>For more information, learn about <a href="https://developers.cloudflare.com/stream/transform-videos/">Transforming Videos</a>.</p>Tue, 10 Jun 2025 00:00:00 GMTStreamStreamWorkers - Access git commit sha and branch name as environment variables in Workers Buildshttps://developers.cloudflare.com/changelog/post/2025-06-10-default-env-vars/https://developers.cloudflare.com/changelog/post/2025-06-10-default-env-vars/<p><a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a> connects your Worker to a <a href="https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/">Git repository</a>, and automates building and deploying your code on each pushed change.</p> <p>To make CI/CD pipelines even more flexible, Workers Builds now automatically injects <a href="https://developers.cloudflare.com/workers/ci-cd/builds/configuration/#environment-variables">default environment variables</a> into your build process (much like the defaults in <a href="https://developers.cloudflare.com/pages/configuration/build-configuration/#environment-variables">Cloudflare Pages projects</a>). You can use these variables to customize your build process based on the deployment context, such as the branch or commit.</p> <p>The following environment variables are injected by default:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Environment Variable</th> <th>Injected value</th> <th>Example use-case</th> </tr> </thead> <tbody> <tr> <td><code>CI</code></td> <td><code>true</code></td> <td>Changing build behavior when run on CI versus locally</td> </tr> <tr> <td><code>WORKERS_CI</code></td> <td><code>1</code></td> <td>Changing build behavior when run on Workers Builds versus locally</td> </tr> <tr> <td><code>WORKERS_CI_BUILD_UUID</code></td> <td><code>&lt;build-uuid-of-current-build&gt;</code></td> <td>Passing the Build UUID along to custom workflows</td> </tr> <tr> <td><code>WORKERS_CI_COMMIT_SHA</code></td> <td><code>&lt;sha1-hash-of-current-commit&gt;</code></td> <td>Passing current commit ID to error reporting, for example, Sentry</td> </tr> <tr> <td><code>WORKERS_CI_BRANCH</code></td> <td><code>&lt;branch-name-from-push-event</code></td> <td>Customizing build based on branch, for example, disabling debug logging on <code>production</code></td> </tr> </tbody> </table></div> <p>You can override these default values and add your own custom environment variables by navigating to <strong>your Worker</strong> &gt; <strong>Settings</strong> &gt; <strong>Environment variables</strong>.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/workers/ci-cd/builds/configuration/#environment-variables">Build configuration documentation</a>.</p>Tue, 10 Jun 2025 00:00:00 GMTWorkersWorkersRules - More flexible fallback handling — Custom Errors now support fetching assets returned with 4xx or 5xx status codeshttps://developers.cloudflare.com/changelog/post/2025-06-09-custom-errors-fetch-4xx-5xx-assets/https://developers.cloudflare.com/changelog/post/2025-06-09-custom-errors-fetch-4xx-5xx-assets/<p><a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors</a> can now fetch and store <a href="https://developers.cloudflare.com/rules/custom-errors/create-rules/#create-a-custom-error-asset-dashboard">assets</a> and <a href="https://developers.cloudflare.com/rules/custom-errors/#error-pages">error pages</a> from your origin even if they are served with a 4xx or 5xx HTTP status code — previously, only 200 OK responses were allowed.</p> <p><strong>What’s new:</strong></p> <ul> <li>You can now upload error pages and error assets that return error status codes (for example, 403, 500, 502, 503, 504) when fetched.</li> <li>These assets are stored and minified at the edge, so they can be reused across multiple Custom Error rules without triggering requests to the origin.</li> </ul> <p>This is especially useful for retrieving error content or downtime banners from your backend when you can’t override the origin status code.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors</a> documentation.</p>Mon, 09 Jun 2025 00:00:00 GMTRulesRulesRules - Match Workers subrequests by upstream zone — cf.worker.upstream_zone now supported in Transform Ruleshttps://developers.cloudflare.com/changelog/post/2025-06-09-transform-rule-subrequest-matching/https://developers.cloudflare.com/changelog/post/2025-06-09-transform-rule-subrequest-matching/ <p>You can now use the <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/cf.worker.upstream_zone/"><code>cf.worker.upstream_zone</code></a> field in <a href="https://developers.cloudflare.com/rules/transform/">Transform Rules</a> to control rule execution based on whether a request originates from <a href="https://developers.cloudflare.com/workers/">Workers</a>, including subrequests issued by Workers in other zones.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1446,height=988,format=webp/_astro/transform-rule-subrequest-matching.BeUBEN67.png" alt="Match Workers subrequests by upstream zone in Transform Rules" loading="lazy" decoding="async" width="1446" height="988"> <p><strong>What's new:</strong></p> <ul> <li><code>cf.worker.upstream_zone</code> is now supported in Transform Rules expressions.</li> <li>Skip or apply logic conditionally when handling <a href="https://developers.cloudflare.com/workers/platform/limits/#subrequests">Workers subrequests</a>.</li> </ul> <p>For example, to add a header when the subrequest comes from another zone:</p> <article class="bg-card ring-border my-4 rounded-lg p-5 shadow-sm ring"><div class="text-sm leading-normal text-muted-foreground example--no-title"><p>Text in <strong>Expression Editor</strong> (replace <code>myappexample.com</code> with your domain):</p><figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">(cf.worker.upstream_zone != "" and cf.worker.upstream_zone != "myappexample.com")</span></span></code></pre></figure><p>Selected operation under <strong>Modify request header</strong>: <em>Set static</em></p><p><strong>Header name</strong>: <code>X-External-Workers-Subrequest</code></p><p><strong>Value</strong>: <code>1</code></p></div></article> <p>This gives you more granular control in how you handle incoming requests for your zone.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/rules/transform/">Transform Rules</a> documentation and <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/">Rules language fields</a> reference.</p>Mon, 09 Jun 2025 00:00:00 GMTRulesRulesWAF - WAF Release - 2025-06-09https://developers.cloudflare.com/changelog/post/2025-06-09-waf-release/https://developers.cloudflare.com/changelog/post/2025-06-09-waf-release/ <p>This week’s update spotlights four critical vulnerabilities across CMS platforms, VoIP systems, and enterprise applications. Several flaws enable remote code execution or privilege escalation, posing significant enterprise risks.</p> <p><strong>Key Findings</strong></p> <ul> <li>WordPress OttoKit Plugin (CVE-2025-27007): Privilege escalation flaw allows unauthenticated attackers to create or elevate user accounts, compromising WordPress administrative control.</li> <li>SAP NetWeaver (CVE-2025-42999): Remote Code Execution vulnerability enables attackers to execute arbitrary code on SAP NetWeaver systems, threatening core ERP and business operations.</li> <li>Fortinet FortiVoice (CVE-2025-32756): Buffer error vulnerability may lead to memory corruption and potential code execution, directly impacting enterprise VoIP infrastructure.</li> <li>Camaleon CMS (CVE-2024-46986): Remote Code Execution vulnerability allows attackers to gain full control over Camaleon CMS installations, exposing hosted content and underlying servers.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities target widely deployed CMS, ERP, and VoIP systems. RCE flaws in SAP NetWeaver and Camaleon CMS allow full takeover of business-critical applications. Privilege escalation in OttoKit exposes WordPress environments to full administrative compromise. FortiVoice buffer handling issues risk destabilizing or fully compromising enterprise telephony systems.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4afd50a3ef1948bba87c4e620debd86e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0debd86e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100769</td><td><p>WordPress OttoKit Plugin - Privilege Escalation - CVE:CVE-2025-27007</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="24134c41c3e940daa973b4b95f57b448"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5f57b448</span></button></rule-id></td><td>100770</td><td>SAP NetWeaver - Remote Code Execution - CVE:CVE-2025-42999</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="4f219ac0be3545a5be5f0bf34df8857a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4df8857a</span></button></rule-id></td><td>100779</td><td>Fortinet FortiVoice - Buffer Error - CVE:CVE-2025-32756</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bc8dfbe8cbac4c039725ec743b840107"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3b840107</span></button></rule-id></td><td>100780</td><td>Camaleon CMS - Remote Code Execution - CVE:CVE-2024-46986</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 09 Jun 2025 00:00:00 GMTWAFWAFWorkers - Workers native integrations were removed from the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-06-09-workers-integrations-changes/https://developers.cloudflare.com/changelog/post/2025-06-09-workers-integrations-changes/<p>Workers native integrations were <a href="https://blog.cloudflare.com/announcing-database-integrations/" target="_blank" rel="noopener">originally launched in May 2023<span class="external-link"> ↗</span></a> to connect to popular database and observability providers with your Worker in just a few clicks. We are changing how developers connect Workers to these external services. The <strong>Integrations</strong> tab in the dashboard has been removed in favor of a more direct, command-line-based approach using <a href="https://developers.cloudflare.com/workers/wrangler/commands/general/#secret">Wrangler secrets</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="whats-changed">What's changed</h4><a class="anchor-link" href="#whats-changed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Integrations tab removed</strong>: The integrations setup flow is no longer available in the Workers dashboard.</li> <li><strong>Manual secret configuration</strong>: New connections should be configured by adding credentials as secrets to your Workers using <code>npx wrangler secret put</code> commands.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="impact-on-existing-integrations">Impact on existing integrations</h4><a class="anchor-link" href="#impact-on-existing-integrations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Existing integrations will continue to work without any changes required.</strong> If you have integrations that were previously created through the dashboard, they will remain functional.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="updating-existing-integrations">Updating existing integrations</h4><a class="anchor-link" href="#updating-existing-integrations"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you'd like to modify your existing integration, you can update the secrets, environment variables, or <a href="https://developers.cloudflare.com/workers/observability/logs/tail-workers/">Tail Workers</a> that were created from the original integration setup.</p> <ul> <li><strong>Update secrets</strong>: Use <code>npx wrangler secret put &lt;SECRET_NAME&gt;</code> to update credential values.</li> <li><strong>Modify environment variables</strong>: Update variables through the dashboard or Wrangler configuration.</li> <li><strong>Dashboard management</strong>: Access your Worker's settings in the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> to modify connections created by our removed native integrations feature.</li> </ul> <p>If you have previously set up an observability integration with <a href="https://sentry.io" target="_blank" rel="noopener">Sentry<span class="external-link"> ↗</span></a>, the following environment variables were set and are still modifiable:</p> <ul> <li><code>BLOCKED_HEADERS</code>: headers to exclude sending to Sentry</li> <li><code>EXCEPTION_SAMPLING_RATE</code>: number from 0 - 100, where 0 = no events go through to Sentry, and 100 = all events go through to Sentry</li> <li><code>STATUS_CODES_TO_SAMPLING_RATES</code>: a map of status codes -- like 400 or with wildcards like 4xx -- to sampling rates described above</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="setting-up-new-database-and-observability-connections">Setting up new database and observability connections</h4><a class="anchor-link" href="#setting-up-new-database-and-observability-connections"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For new connections, refer to our step-by-step guides on connecting to popular database and observability providers including: <a href="https://developers.cloudflare.com/workers/observability/third-party-integrations/sentry">Sentry</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/turso/">Turso</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/neon/">Neon</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/supabase/">Supabase</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/planetscale/">PlanetScale</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/upstash/">Upstash</a>, <a href="https://developers.cloudflare.com/workers/databases/third-party-integrations/xata/">Xata</a>.</p>Mon, 09 Jun 2025 00:00:00 GMTWorkersWorkersWorkers - Performance and size optimization for the Cloudflare adapter for Open Nexthttps://developers.cloudflare.com/changelog/post/2025-06-05-open-next-size/https://developers.cloudflare.com/changelog/post/2025-06-05-open-next-size/<p>With the release of the Cloudflare adapter for Open Next v1.0.0 in May 2025, we already had followups plans <a href="https://blog.cloudflare.com/deploying-nextjs-apps-to-cloudflare-workers-with-the-opennext-adapter/#1-0-and-the-road-ahead" target="_blank" rel="noopener">to improve performance and size<span class="external-link"> ↗</span></a>.</p> <p><code>@opennextjs/cloudflare</code> v1.2 released on June 5, 2025 delivers on these enhancements. By removing <code>babel</code> from the app code and dropping a dependency on <code>@ampproject/toolbox-optimizer</code>, we were able to reduce generated bundle sizes. Additionally, by stopping preloading of all app routes, we were able to improve the cold start time.</p> <p>This means that users will now see a decrease from 14 to 8MiB (2.3 to 1.6MiB gzipped) in generated bundle size for a Next app created via create-next-app, and typically 100ms faster startup times for their medium-sized apps.</p> <p>Users only need to update to the latest version of <code>@opennextjs/cloudflare</code> to automatically benefit from these improvements.</p> <p>Note that we published <a href="https://github.com/opennextjs/opennextjs-cloudflare/security/advisories/GHSA-rvpw-p7vw-wj3m" target="_blank" rel="noopener">CVE-2005-6087<span class="external-link"> ↗</span></a> for a SSRF vulnerability in the <code>@opennextjs/cloudflare</code> package. The vulnerability has been fixed from <code>@opennextjs/cloudflare</code> v1.3.0 onwards. Please update to any version after this one.</p>Thu, 05 Jun 2025 19:00:00 GMTWorkersWorkersAccess, Cloudflare One - Cloudflare One Analytics Dashboards and Exportable Access Reporthttps://developers.cloudflare.com/changelog/post/dashboards-access-report/https://developers.cloudflare.com/changelog/post/dashboards-access-report/<p>Cloudflare One now offers powerful new analytics dashboards to help customers easily discover available insights into their application access and network activity. These dashboards provide a centralized, intuitive view for understanding user behavior, application usage, and security posture.</p> <p>![Cloudflare One Analytics Dashboards](~/assets/images/changelog/cloudflare-one/Analytics Dashboards.png)</p> <p>Additionally, a new exportable access report is available, allowing customers to quickly view high-level metrics and trends in their application access. A <strong>preview</strong> of the report is shown below, with more to be found in the report:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2406,height=950,format=webp/_astro/access-report.C744W7JR.png" alt="Cloudflare One Analytics Dashboards" loading="lazy" decoding="async" width="2406" height="950"> <p>Both features are accessible in the Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>, empowering organizations with better visibility and control.</p>Thu, 05 Jun 2025 00:00:00 GMTAccessAccessCloudflare OneLoad Balancing - New Account-Level Load Balancing UI and Private Load Balancershttps://developers.cloudflare.com/changelog/post/2025-06-04-account-load-balancing-ui/https://developers.cloudflare.com/changelog/post/2025-06-04-account-load-balancing-ui/<p>We've made two large changes to load balancing:</p> <ul> <li>Redesigned the user interface, now centralized at the <strong>account level</strong>.</li> <li>Introduced <a href="https://developers.cloudflare.com/load-balancing/private-network/"><strong>Private Load Balancers</strong></a> to the UI, enabling you to manage traffic for all of your external and internal applications in a single spot.</li> </ul> <p>This update streamlines how you manage load balancers across multiple zones and extends robust traffic management to your private network infrastructure.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=822,format=webp/_astro/account-load-balancing-ui.CoCi7gPb.png" alt="Load Balancing UI" loading="lazy" decoding="async" width="1600" height="822"> <p><strong>Key Enhancements:</strong></p> <ul> <li> <p><strong>Account-Level UI Consolidation:</strong></p> <ul> <li> <p><strong>Unified Management:</strong> Say goodbye to navigating individual zones for load balancing tasks. You can now view, configure, and monitor all your load balancers across every zone in your account from a single, intuitive interface at the account level.</p> </li> <li> <p><strong>Improved Efficiency:</strong> This centralized approach provides a more streamlined workflow, making it faster and easier to manage both your public-facing and internal traffic distribution.</p> </li> </ul> </li> <li> <p><strong>Private Network Load Balancing:</strong></p> <ul> <li> <p><strong>Secure Internal Application Access:</strong> Create <a href="https://developers.cloudflare.com/load-balancing/private-network/"><strong>Private Load Balancers</strong></a> to distribute traffic to applications hosted within your private network, ensuring they are not exposed to the public Internet.</p> </li> <li> <p><strong>WARP &amp; Magic WAN Integration:</strong> Effortlessly direct internal traffic from users connected via Cloudflare WARP or through your Magic WAN infrastructure to the appropriate internal endpoint pools.</p> </li> <li> <p><strong>Enhanced Security for Internal Resources:</strong> Combine reliable Load Balancing with Zero Trust access controls to ensure your internal services are both performant and only accessible by verified users.</p> </li> </ul> </li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=744,format=webp/_astro/private-load-balancer.yti20m_p.png" alt="Private Load Balancers" loading="lazy" decoding="async" width="1600" height="744">Wed, 04 Jun 2025 00:00:00 GMTLoad BalancingLoad BalancingAI Gateway - AI Gateway adds OpenAI compatible endpointhttps://developers.cloudflare.com/changelog/post/2025-06-03-aig-openai-compatible-endpoint/https://developers.cloudflare.com/changelog/post/2025-06-03-aig-openai-compatible-endpoint/<p>Users can now use an <a href="https://developers.cloudflare.com/ai-gateway/usage/chat-completion/">OpenAI Compatible endpoint</a> in AI Gateway to easily switch between providers, while keeping the exact same request and response formats. We're launching now with the chat completions endpoint, with the embeddings endpoint coming up next.</p> <p>To get started, use the OpenAI compatible chat completions endpoint URL with your own account id and gateway id and switch between providers by changing the <code>model</code> and <code>apiKey</code> parameters.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">OpenAI SDK Example</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> OpenAI </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "openai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> OpenAI</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> apiKey: </span><span class="nb-shiki-mdbnqw">"YOUR_PROVIDER_API_KEY"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Provider API key</span></span> <span class="line"><span class="nb-shiki-140thh"> baseURL:</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/compat"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.chat.completions.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"google-ai-studio/gemini-2.0-flash"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"What is Cloudflare?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(response.choices[</span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">].message.content);</span></span></code></pre></figure> <p>Additionally, the <a href="https://developers.cloudflare.com/ai-gateway/usage/chat-completion/">OpenAI Compatible endpoint</a> can be combined with our <a href="https://developers.cloudflare.com/ai-gateway/usage/universal/">Universal Endpoint</a> to add fallbacks across multiple providers. That means AI Gateway will return every response in the same standardized format, no extra parsing logic required!</p> <p>Learn more in the <a href="https://developers.cloudflare.com/ai-gateway/usage/chat-completion/">OpenAI Compatibility</a> documentation.</p>Tue, 03 Jun 2025 00:00:00 GMTAI GatewayAI GatewayDNS - Improved onboarding for Shopify merchantshttps://developers.cloudflare.com/changelog/post/2025-06-03-shopify-o2o-improvements/https://developers.cloudflare.com/changelog/post/2025-06-03-shopify-o2o-improvements/<p>Shopify merchants can now onboard to <strong>O2O</strong> automatically, without needing to contact support or community members.</p> <p>What's new:</p> <ul> <li> <p><strong>Automatic enablement</strong> – O2O is available for all mutual Cloudflare and Shopify customers.</p> </li> <li> <p><strong>Branded record display</strong> – Merchants see a Shopify logo in DNS records, complete with helpful tooltips.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=848,height=112,format=webp/_astro/shop-dns-icon-o2o.Ca5DAZHL.png" alt="Shopify O2O logo" loading="lazy" decoding="async" width="848" height="112"></li> <li> <p><strong>Checkout protection</strong> – Workers and Snippets are blocked from running on the checkout path to reduce risk and improve security.</p> </li> </ul> <p>For more information, refer to the <a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/saas-customers/provider-guides/shopify/">provider guide</a>.</p>Tue, 03 Jun 2025 00:00:00 GMTDNSDNSWorkers - View an architecture diagram of your Worker directly in the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-06-03-visualize-your-worker-architecture/https://developers.cloudflare.com/changelog/post/2025-06-03-visualize-your-worker-architecture/ <p>You can now visualize, explore and modify your Worker’s architecture directly in the Cloudflare dashboard, making it easier to understand how your application connects to Cloudflare resources like <a href="https://developers.cloudflare.com/d1">D1 databases</a>, <a href="https://developers.cloudflare.com/durable-objects">Durable Objects</a>, <a href="https://developers.cloudflare.com/kv">KV namespaces</a>, and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">more</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2679,height=2042,format=webp/_astro/bindings-canvas.CszRUVlh.png" alt="Bindings canvas" loading="lazy" decoding="async" width="2679" height="2042"> <p>With this new view, you can easily:</p> <ul> <li>Explore existing bindings in a visual, architecture-style diagram</li> <li>Add and manage bindings directly from the same interface</li> <li>Discover the full range of compute, storage, AI, and media resources you can attach to your Workers application.</li> </ul> <p>To get started, head to the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> and open the <strong>Bindings</strong> tab of any Workers application.</p>Tue, 03 Jun 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals - Cloudflare User Groups & Enhanced Permission Policies are now in Betahttps://developers.cloudflare.com/changelog/post/2025-06-02-user-groups-beta/https://developers.cloudflare.com/changelog/post/2025-06-02-user-groups-beta/<p>We're excited to announce the Public Beta launch of <strong>User Groups for Cloudflare Dashboard</strong> and <strong>System for Cross Domain Identity Management (SCIM) User Groups</strong>, expanding our RBAC capabilities to simplify user and group management at scale.</p> <p>We've also visually overhauled the <strong>Permission Policies UI</strong> to make defining permissions more intuitive.</p> <p><strong>What's New</strong></p> <p><strong>User Groups [BETA]</strong>: <a href="https://developers.cloudflare.com/fundamentals/manage-members/user-groups/">User Groups</a> are a new Cloudflare IAM primitive that enable administrators to create collections of account members that are treated equally from an access control perspective. User Groups can be assigned permission policies, with individual members in the group inheriting all permissions granted to the User Group. User Groups can be created manually or via our APIs.</p> <p><strong>SCIM User Groups [BETA]</strong>: Centralize &amp; simplify your user and group management at scale by syncing memberships directly from your upstream identity provider (like Okta or Entra ID) to the Cloudflare Platform. This ensures Cloudflare stays in sync with your identity provider, letting you apply Permission Policies to those synced groups directly within the Cloudflare Dashboard.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>SCIM Virtual Groups (identified by the pattern <code>CF-&lt;accountID&gt;-&lt;Role Name&gt;</code> in your IdP) are deprecated as of 06/02/25. We recommend migrating SCIM Virtual Groups implementations to use <a href="https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/">SCIM User Groups</a>. If you did not use Virtual Groups, no action is needed.</p></div></div></aside> <p><strong>Revamped Permission Policies UI [BETA]</strong>: As Cloudflare's services have grown, so has the need for precise, role-based access control. We've given the Permission Policies builder a visual overhaul to make it much easier for administrators to find and define the exact permissions they want for specific principals.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2872,height=1884,format=webp/_astro/2025-06-02-permissions-policy-ux.2wLEPgVX.png" alt="Updated Permissions Policy UX" loading="lazy" decoding="async" width="2872" height="1884"><aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>When opting into the Beta for User Groups and Permission Policies, you'll be transitioning to a new experience. Please be aware that opting out isn't currently available.</p></div></div></aside> <p>For more info:</p> <ul> <li><a href="https://developers.cloudflare.com/fundamentals/manage-members/user-groups/">Get started with User Groups</a></li> <li><a href="https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/">Explore our SCIM integration guide</a></li> </ul>Mon, 02 Jun 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWAF - WAF Release - 2025-06-02https://developers.cloudflare.com/changelog/post/2025-06-02-waf-release/https://developers.cloudflare.com/changelog/post/2025-06-02-waf-release/ <p>This week’s roundup highlights five high-risk vulnerabilities affecting SD-WAN, load balancers, and AI platforms. Several flaws enable unauthenticated remote code execution or authentication bypass.</p> <p><strong>Key Findings</strong></p> <ul> <li>Versa Concerto SD-WAN (CVE-2025-34026, CVE-2025-34027): Authentication bypass vulnerabilities allow attackers to gain unauthorized access to SD-WAN management interfaces, compromising network segmentation and control.</li> <li>Kemp LoadMaster (CVE-2024-7591): Remote Code Execution vulnerability enables attackers to execute arbitrary commands, potentially leading to full device compromise within enterprise load balancing environments.</li> <li>AnythingLLM (CVE-2024-0759): Server-Side Request Forgery (SSRF) flaw allows external attackers to force the LLM backend to make unauthorized internal network requests, potentially exposing sensitive internal resources.</li> <li>Anyscale Ray (CVE-2023-48022): Remote Code Execution vulnerability affecting distributed AI workloads, allowing attackers to execute arbitrary code on Ray cluster nodes.</li> <li>Server-Side Request Forgery (SSRF) - Generic &amp; Obfuscated Payloads: Ongoing advancements in SSRF payload techniques observed, including obfuscation and expanded targeting of cloud metadata services and internal IP ranges.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities expose critical infrastructure across networking, AI platforms, and SaaS integrations. Unauthenticated RCE and auth bypass flaws in Versa Concerto, Kemp LoadMaster, and Anyscale Ray allow full system compromise. AnythingLLM and SSRF payload variants expand attack surfaces into internal cloud resources, sensitive APIs, and metadata services, increasing risk of privilege escalation, data theft, and persistent access.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="752cfb5e6f9c46f0953c742139b52f02"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...39b52f02</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100764</td><td>Versa Concerto SD-WAN - Auth Bypass - CVE:CVE-2025-34027</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a01171de18034901b48a5549a34edb97"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a34edb97</span></button></rule-id></td><td>100765</td><td>Versa Concerto SD-WAN - Auth Bypass - CVE:CVE-2025-34026</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="840b35492a7543c18ffe50fc0d99b2db"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d99b2db</span></button></rule-id></td><td>100766</td><td>Kemp LoadMaster - Remote Code Execution - CVE:CVE-2024-7591</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="121b7070de3a459dbe80d7ed95aa3a4f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...95aa3a4f</span></button></rule-id></td><td>100767</td><td>AnythingLLM - SSRF - CVE:CVE-2024-0759</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="215417f989e2485a9c50eca0840a0966"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...840a0966</span></button></rule-id></td><td>100768</td><td>Anyscale Ray - Remote Code Execution - CVE:CVE-2023-48022</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3ed619a17d4141bda3a8c3869d16ee18"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9d16ee18</span></button></rule-id></td><td>100781</td><td>SSRF - Generic Payloads</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7ce73f6a70be49f8944737465c963d9d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5c963d9d</span></button></rule-id></td><td>100782</td><td>SSRF - Obfuscated Payloads</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 02 Jun 2025 00:00:00 GMTWAFWAFPages - Cloudflare Pages builds now provide Node.js v22 by defaulthttps://developers.cloudflare.com/changelog/post/2025-05-30-pages-build-image-v3/https://developers.cloudflare.com/changelog/post/2025-05-30-pages-build-image-v3/<p>When you use the built-in build system that is part of <a href="https://developers.cloudflare.com/pages/">Cloudflare Pages</a>, the <a href="https://developers.cloudflare.com/pages/configuration/build-image/">Build Image</a> now includes Node.js v22. Previously, Node.js v18 was provided by default, and Node.js v18 is now end-of-life (EOL).</p> <p>If you are creating a new Pages project, the new V3 build image that includes Node.js v22 will be used by default. If you have an existing Pages project, you can update to the latest build image by navigating to Settings &gt; Build &amp; deployments &gt; Build system version in the Cloudflare dashboard for a specific Pages project.</p> <p>Note that you can always specify a particular version of Node.js or other built-in dependencies by <a href="https://developers.cloudflare.com/pages/configuration/build-image/#override-default-versions">setting an environment variable</a>.</p> <p>For more, refer to the <a href="https://developers.cloudflare.com/pages/configuration/build-image">developer docs for Cloudflare Pages builds</a></p>Fri, 30 May 2025 00:00:00 GMTPagesPagesRules - Fine-tune image optimization — WebP now supported in Configuration Ruleshttps://developers.cloudflare.com/changelog/post/2025-05-30-configuration-rules-webp/https://developers.cloudflare.com/changelog/post/2025-05-30-configuration-rules-webp/<p>You can now enable <a href="https://developers.cloudflare.com/images/polish/activate-polish/">Polish</a> with the <code>webp</code> format directly in <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a>, allowing you to optimize image delivery for specific routes, user agents, or A/B tests — without applying changes zone-wide.</p> <p><strong>What’s new:</strong></p> <ul> <li><a href="https://developers.cloudflare.com/images/polish/compression/#webp">WebP</a> is now a supported <a href="https://developers.cloudflare.com/rules/configuration-rules/settings/#polish">value</a> in the <strong>Polish</strong> setting for Configuration Rules.</li> </ul> <p>This gives you more precise control over how images are compressed and delivered, whether you're targeting modern browsers, running experiments, or tailoring performance by geography or device type.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/images/polish/">Polish</a> and <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a> documentation.</p>Fri, 30 May 2025 00:00:00 GMTRulesRulesWorkers - Debug, profile, and view logs for your Worker in Chrome Devtools — now supported in the Cloudflare Vite pluginhttps://developers.cloudflare.com/changelog/post/2025-05-21-vite-plugin-chrome-devtools/https://developers.cloudflare.com/changelog/post/2025-05-21-vite-plugin-chrome-devtools/ <p>You can now <a href="https://developers.cloudflare.com/workers/observability/dev-tools/" target="_blank" rel="noopener">debug, profile, view logs, and analyze memory usage for your Worker<span class="external-link"> ↗</span></a> using <a href="https://developer.chrome.com/docs/devtools" target="_blank" rel="noopener">Chrome Devtools<span class="external-link"> ↗</span></a> when your Worker runs locally using the <a href="https://developers.cloudflare.com/workers/vite-plugin/" target="_blank" rel="noopener">Cloudflare Vite plugin<span class="external-link"> ↗</span></a>.</p> <p>Previously, this was only possible if your Worker ran locally using the <a href="https://developers.cloudflare.com/workers/wrangler/" target="_blank" rel="noopener">Wrangler CLI<span class="external-link"> ↗</span></a>, and now you can do all the same things if your Worker uses <a href="https://vite.dev/" target="_blank" rel="noopener">Vite<span class="external-link"> ↗</span></a>.</p> <p>When you run <code>vite</code>, you'll now see a debug URL in your console:</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67"> VITE v6.3.5 ready in 461 ms</span></span> <span class="line"><span class="nb-shiki-wvjl67"></span></span> <span class="line"><span class="nb-shiki-wvjl67"> ➜ Local: http://localhost:5173/</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ➜ Network: use --host to expose</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ➜ Debug: http://localhost:5173/__debug</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ➜ press h + enter to show help</span></span></code></pre></figure> <p>Open the URL in Chrome, and an instance of Chrome Devtools will open and connect to your Worker running locally. You can then use Chrome Devtools to debug and introspect performance issues. For example, you can navigate to the Performance tab to understand where CPU time is spent in your Worker:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2144,height=1134,format=webp/_astro/profile.Dz8PUp_K.png" alt="CPU Profile" loading="lazy" decoding="async" width="2144" height="1134"> <p>For more information on how to get the most out of Chrome Devtools, refer to the following docs:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/observability/dev-tools/breakpoints/">Debug code by setting breakpoints</a></li> <li><a href="https://developers.cloudflare.com/workers/observability/dev-tools/cpu-usage/">Profile CPU usage</a></li> <li><a href="https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/">Observe memory usage and debug memory leaks</a></li> </ul>Fri, 30 May 2025 00:00:00 GMTWorkersWorkersGateway, Cloudflare One - New Gateway Analytics in the Cloudflare One Dashboardhttps://developers.cloudflare.com/changelog/post/gateway-analytics-v2/https://developers.cloudflare.com/changelog/post/gateway-analytics-v2/<p>Users can now access significant enhancements to Cloudflare Gateway analytics, providing you with unprecedented visibility into your organization's DNS queries, HTTP requests, and Network sessions. These powerful new dashboards enable you to go beyond raw logs and gain actionable insights into how your users are interacting with the Internet and your protected resources.</p> <p>You can now visualize and explore:</p> <ul> <li>Patterns Over Time: Understand trends in traffic volume and blocked requests, helping you identify anomalies and plan for future capacity.</li> <li>Top Users &amp; Destinations: Quickly pinpoint the most active users, enabling better policy enforcement and resource allocation.</li> <li>Actions Taken: See a clear breakdown of security actions applied by Gateway policies, such as blocks and allows, offering a comprehensive view of your security posture.</li> <li>Geographic Regions: Gain insight into the global distribution of your traffic.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2740,height=1166,format=webp/_astro/gateway-analytics.BdSwbIBb.png" alt="Gateway Analytics" loading="lazy" decoding="async" width="2740" height="1166"> <p>To access the new overview, log in to your Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a> and go to Analytics in the side navigation bar.</p>Thu, 29 May 2025 00:00:00 GMTGatewayGatewayCloudflare OneD1, Workers - 50-500ms Faster D1 REST API Requestshttps://developers.cloudflare.com/changelog/post/2025-05-30-d1-rest-api-latency/https://developers.cloudflare.com/changelog/post/2025-05-30-d1-rest-api-latency/<p>Users using Cloudflare's <a href="https://developers.cloudflare.com/api/resources/d1/">REST API</a> to query their D1 database can see lower end-to-end request latency now that D1 authentication is performed at the closest Cloudflare network data center that received the request. Previously, authentication required D1 REST API requests to proxy to Cloudflare's core, centralized data centers, which added network round trips and latency.</p> <p>Latency improvements range from 50-500 ms depending on request location and <a href="https://developers.cloudflare.com/d1/configuration/data-location/">database location</a> and only apply to the REST API. REST API requests and databases outside the United States see a bigger benefit since Cloudflare's primary core data centers reside in the United States.</p> <p>D1 query endpoints like <code>/query</code> and <code>/raw</code> have the most noticeable improvements since they no longer access Cloudflare's core data centers. D1 control plane endpoints such as those to create and delete databases see smaller improvements, since they still require access to Cloudflare's core data centers for other control plane metadata.</p>Thu, 29 May 2025 00:00:00 GMTD1D1WorkersBrowser Run - Playwright MCP server is now compatible with Browser Renderinghttps://developers.cloudflare.com/changelog/post/2025-05-28-playwright-mcp/https://developers.cloudflare.com/changelog/post/2025-05-28-playwright-mcp/ <p>We're excited to share that you can now use the <a href="https://github.com/cloudflare/playwright-mcp" target="_blank" rel="noopener">Playwright MCP<span class="external-link"> ↗</span></a> server with Browser Rendering.</p> <p>Once you <a href="https://developers.cloudflare.com/browser-run/playwright/playwright-mcp/#deploying">deploy the server</a>, you can use any MCP client with it to interact with Browser Rendering. This allows you to run AI models that can automate browser tasks, such as taking screenshots, filling out forms, or scraping data.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1420,height=914,format=webp/_astro/playground-ai-screenshot.v44jFMBu.png" alt="Access Analytics" loading="lazy" decoding="async" width="1420" height="914"> <p>Playwright MCP is available as an npm package at <a href="https://www.npmjs.com/package/@cloudflare/playwright-mcp" target="_blank" rel="noopener"><code>@cloudflare/playwright-mcp</code><span class="external-link"> ↗</span></a>. To install it, type:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-npm" id="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-yarn" id="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-pnpm" id="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-bun" id="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-npm" aria-labelledby="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i -D @cloudflare/playwright-mcp</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i -D @cloudflare/playwright-mcp" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-yarn" aria-labelledby="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add -D @cloudflare/playwright-mcp</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add -D @cloudflare/playwright-mcp" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-pnpm" aria-labelledby="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add -D @cloudflare/playwright-mcp</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add -D @cloudflare/playwright-mcp" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-bun" aria-labelledby="pm-tab-pm-c97dfc50-b8fb-4a93-bf32-bd4a5eb9e9f1-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add -d @cloudflare/playwright-mcp</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add -d @cloudflare/playwright-mcp" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Deploying the server is then as easy as:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMcpAgent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/playwright-mcp"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> PlaywrightMCP</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createMcpAgent</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> PlaywrightMCP.</span><span class="nb-shiki-1t8gfj">mount</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"/sse"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Check out the full code at <a href="https://github.com/cloudflare/playwright-mcp" target="_blank" rel="noopener">GitHub<span class="external-link"> ↗</span></a>.</p> <p>Learn more about Playwright MCP in our <a href="https://developers.cloudflare.com/browser-run/playwright/playwright-mcp/">documentation</a>.</p>Wed, 28 May 2025 00:00:00 GMTBrowser RunBrowser RunWAF - Updated attack score modelhttps://developers.cloudflare.com/changelog/post/2025-05-28-updated-attack-score-model/https://developers.cloudflare.com/changelog/post/2025-05-28-updated-attack-score-model/<p>We have deployed an updated attack score model focused on enhancing the detection of multiple false positives (FPs).</p> <p>As a result of this improvement, some changes in observed attack scores are expected.</p>Wed, 28 May 2025 00:00:00 GMTWAFWAFSSL/TLS, Cloudflare for SaaS, Secrets Store - Increased limits for Cloudflare for SaaS and Secrets Store free and Pay-as-you-go planshttps://developers.cloudflare.com/changelog/post/2025-05-19-paygo-updates/https://developers.cloudflare.com/changelog/post/2025-05-19-paygo-updates/ <p>With upgraded limits to <a href="https://www.cloudflare.com/plans/" target="_blank" rel="noopener">all free and paid plans<span class="external-link"> ↗</span></a>, you can now scale more easily with <a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/" target="_blank" rel="noopener">Cloudflare for SaaS<span class="external-link"> ↗</span></a> and <a href="https://developers.cloudflare.com/secrets-store/" target="_blank" rel="noopener">Secrets Store<span class="external-link"> ↗</span></a>.</p> <p><a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/" target="_blank" rel="noopener">Cloudflare for SaaS<span class="external-link"> ↗</span></a> allows you to extend the benefits of Cloudflare to your customers via their own custom or vanity domains. Now, the <a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/plans/" target="_blank" rel="noopener">limit for custom hostnames<span class="external-link"> ↗</span></a> on a Cloudflare for SaaS Pay-as-you-go plan has been <strong>raised from 5,000 custom hostnames to 50,000 custom hostnames.</strong></p> <p>With custom origin server -- previously an enterprise-only feature -- you can route traffic from one or more custom hostnames somewhere other than your default proxy fallback. <a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/start/advanced-settings/custom-origin/" target="_blank" rel="noopener">Custom origin server<span class="external-link"> ↗</span></a> is now available to Cloudflare for SaaS customers on Free, Pro, and Business plans.</p> <p>You can enable custom origin server on a per-custom hostname basis <a href="https://developers.cloudflare.com/api/resources/custom_hostnames/methods/edit/" target="_blank" rel="noopener">via the API<span class="external-link"> ↗</span></a> or the UI:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1896,height=1636,format=webp/_astro/custom-origin-server.B-BXcG-1.png" alt="Import repo or choose template" loading="lazy" decoding="async" width="1896" height="1636"> <p>Currently <a href="https://blog.cloudflare.com/secrets-store-beta/" target="_blank" rel="noopener">in beta with a Workers integration<span class="external-link"> ↗</span></a>, <a href="https://developers.cloudflare.com/secrets-store/" target="_blank" rel="noopener">Cloudflare Secrets Store<span class="external-link"> ↗</span></a> allows you to store, manage, and deploy account level secrets from a secure, centralized platform your <a href="https://developers.cloudflare.com/workers/" target="_blank" rel="noopener">Cloudflare Workers<span class="external-link"> ↗</span></a>. Now, you can create and deploy <strong>100 secrets per account</strong>. Try it out <a href="http://dash.cloudflare.com/?to=/:account/secrets-store" target="_blank" rel="noopener">in the dashboard<span class="external-link"> ↗</span></a>, with <a href="https://developers.cloudflare.com/secrets-store/integrations/workers/" target="_blank" rel="noopener">Wrangler<span class="external-link"> ↗</span></a>, or <a href="https://developers.cloudflare.com/api/resources/secrets_store/" target="_blank" rel="noopener">via the API<span class="external-link"> ↗</span></a> today.</p>Tue, 27 May 2025 11:00:00 GMTSSL/TLSSSL/TLSCloudflare for SaaSSecrets StoreGateway - Gateway Protocol Detection Now Available for Pay-as-you-go and Free Planshttps://developers.cloudflare.com/changelog/post/2025-05-27-Protocol-Detection-availability/https://developers.cloudflare.com/changelog/post/2025-05-27-Protocol-Detection-availability/<p>All Cloudflare One Gateway users can now use Protocol detection logging and filtering, including those on Pay-as-you-go and Free plans.</p> <p>With Protocol Detection, admins can identify and enforce policies on traffic proxied through Gateway based on the underlying network protocol (for example, HTTP, TLS, or SSH), enabling more granular traffic control and security visibility no matter your plan tier.</p> <p>This feature is available to enable in your account network settings for all accounts. For more information on using Protocol Detection, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/">Protocol detection documentation</a>.</p>Tue, 27 May 2025 00:00:00 GMTGatewayGatewayWAF - WAF Release - 2025-05-27https://developers.cloudflare.com/changelog/post/2025-05-27-waf-release/https://developers.cloudflare.com/changelog/post/2025-05-27-waf-release/ <p>This week’s roundup covers nine vulnerabilities, including six critical RCEs and one dangerous file upload. Affected platforms span cloud services, CI/CD pipelines, CMSs, and enterprise backup systems. Several are now addressed by updated WAF managed rulesets.</p> <p><strong>Key Findings</strong></p> <ul> <li>Ingress-Nginx (CVE-2025-1098): Unauthenticated RCE via unsafe annotation handling. Impacts Kubernetes clusters.</li> <li>GitHub Actions (CVE-2025-30066): RCE through malicious workflow inputs. Targets CI/CD pipelines.</li> <li>Craft CMS (CVE-2025-32432): Template injection enables unauthenticated RCE. High risk to content-heavy sites.</li> <li>F5 BIG-IP (CVE-2025-31644): RCE via TMUI exploit, allowing full system compromise.</li> <li>AJ-Report (CVE-2024-15077): RCE through untrusted template execution. Affects reporting dashboards.</li> <li>NAKIVO Backup (CVE-2024-48248): RCE via insecure script injection. High-value target for ransomware.</li> <li>SAP NetWeaver (CVE-2025-31324): Dangerous file upload flaw enables remote shell deployment.</li> <li>Ivanti EPMM (CVE-2025-4428, 4427): Auth bypass allows full access to mobile device management.</li> <li>Vercel (CVE-2025-32421): Information leak via misconfigured APIs. Useful for attacker recon.</li> </ul> <p><strong>Impact</strong></p> <p>These vulnerabilities expose critical components across Kubernetes, CI/CD pipelines, and enterprise systems to severe threats including unauthenticated remote code execution, authentication bypass, and information leaks. High-impact flaws in Ingress-Nginx, Craft CMS, F5 BIG-IP, and NAKIVO Backup enable full system compromise, while SAP NetWeaver and AJ-Report allow remote shell deployment and template-based attacks. Ivanti EPMM’s auth bypass further risks unauthorized control over mobile device fleets.</p> <p>GitHub Actions and Vercel introduce supply chain and reconnaissance risks, allowing malicious workflow inputs and data exposure that aid in targeted exploitation. Organizations should prioritize immediate patching, enhance monitoring, and deploy updated WAF and IDS signatures to defend against likely active exploitation.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6a61a14f44af4232a44e45aad127592a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d127592a</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100746</td><td>Vercel - Information Disclosure</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bd30b3c43eb44335ab6013c195442495"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...95442495</span></button></rule-id></td><td>100754</td><td>AJ-Report - Remote Code Execution - CVE:CVE-2024-15077</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6a13bd6e5fc94b1d9c97eb87dfee7ae4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dfee7ae4</span></button></rule-id></td><td>100756</td><td>NAKIVO Backup - Remote Code Execution - CVE:CVE-2024-48248</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a4af6f2f15c9483fa9eab01d1c52f6d0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1c52f6d0</span></button></rule-id></td><td>100757</td><td>Ingress-Nginx - Remote Code Execution - CVE:CVE-2025-1098</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="bd30b3c43eb44335ab6013c195442495"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...95442495</span></button></rule-id></td><td>100759</td><td>SAP NetWeaver - Dangerous File Upload - CVE:CVE-2025-31324</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="dab2df4f548349e3926fee845366ccc1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5366ccc1</span></button></rule-id></td><td>100760</td><td>Craft CMS - Remote Code Execution - CVE:CVE-2025-32432</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5eb23f172ed64ee08895e161eb40686b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...eb40686b</span></button></rule-id></td><td>100761</td><td>GitHub Action - Remote Code Execution - CVE:CVE-2025-30066</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="827037f2d5f941789efcba6260fc041c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...60fc041c</span></button></rule-id></td><td>100762</td><td>Ivanti EPMM - Auth Bypass - CVE:CVE-2025-4428, CVE:CVE-2025-4427</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ddee6d1c4f364768b324609cebafdfe6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ebafdfe6</span></button></rule-id></td><td>100763</td><td>F5 Big IP - Remote Code Execution - CVE:CVE-2025-31644</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Tue, 27 May 2025 00:00:00 GMTWAFWAFAnalytics - New GraphQL Analytics API Explorer and MCP Serverhttps://developers.cloudflare.com/changelog/post/2025-05-23-graphql-api-explorer/https://developers.cloudflare.com/changelog/post/2025-05-23-graphql-api-explorer/<p>We’ve launched two powerful new tools to make the GraphQL Analytics API more accessible:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="graphql-api-explorer">GraphQL API Explorer</h4><a class="anchor-link" href="#graphql-api-explorer"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <a href="https://graphql.cloudflare.com/explorer" target="_blank" rel="noopener">GraphQL API Explorer<span class="external-link"> ↗</span></a> helps you build, test, and run queries directly in your browser. Features include:</p> <ul> <li>In-browser schema documentation to browse available datasets and fields</li> <li>Interactive query editor with autocomplete and inline documentation</li> <li>A "Run in GraphQL API Explorer" button to execute example queries from our docs</li> <li>Seamless OAuth authentication — no manual setup required</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2626,height=974,format=webp/_astro/graphql-api-explorer.CPUNZZ5B.png" alt="GraphQL API Explorer" loading="lazy" decoding="async" width="2626" height="974"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="graphql-model-context-protocol-mcp-server">GraphQL Model Context Protocol (MCP) Server</h4><a class="anchor-link" href="#graphql-model-context-protocol-mcp-server"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>MCP Servers let you use natural language tools like Claude to generate structured queries against your data. See our <a href="https://blog.cloudflare.com/thirteen-new-mcp-servers-from-cloudflare/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a> for details on how they work and which servers are available. The new <a href="https://github.com/cloudflare/mcp-server-cloudflare/tree/main/apps/graphql" target="_blank" rel="noopener">GraphQL MCP server<span class="external-link"> ↗</span></a> helps you discover and generate useful queries for the GraphQL Analytics API. With this server, you can:</p> <ul> <li>Explore what data is available to query</li> <li>Generate and refine queries using natural language, with one-click links to run them in the API Explorer</li> <li>Build dashboards and visualizations from structured query outputs</li> </ul> <p>Example prompts include:</p> <ul> <li>“Show me HTTP traffic for the last 7 days for example.com”</li> <li>“What GraphQL node returns firewall events?”</li> <li>“Can you generate a link to the Cloudflare GraphQL API Explorer with a pre-populated query and variables?”</li> </ul> <p>We’re continuing to expand these tools, and your feedback helps shape what’s next. <a href="https://developers.cloudflare.com/analytics/graphql-api/">Explore the documentation</a> to learn more and get started.</p>Fri, 23 May 2025 00:00:00 GMTAnalyticsAnalyticsWorkers - Handle incoming request cancellation in Workers with Request.signalhttps://developers.cloudflare.com/changelog/post/2025-05-22-handle-request-cancellation/https://developers.cloudflare.com/changelog/post/2025-05-22-handle-request-cancellation/ <p>In Cloudflare Workers, you can now attach an event listener to <a href="https://developers.cloudflare.com/workers/runtime-apis/request/"><code>Request</code></a> objects, using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Request/signal" target="_blank" rel="noopener"><code>signal</code> property<span class="external-link"> ↗</span></a>. This allows you to perform tasks when the request to your Worker is canceled by the client. To use this feature, you must set the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-requestsignal-for-incoming-requests"><code>enable_request_signal</code></a> compatibility flag.</p> <p>You can use a listener to perform cleanup tasks or write to logs before your Worker's invocation ends. For example, if you run the Worker below, and then abort the request from the client, a log will be written:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // This sets up an event listener that will be called if the client disconnects from your</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // worker.</span></span> <span class="line"><span class="nb-shiki-140thh"> request.signal.</span><span class="nb-shiki-1t8gfj">addEventListener</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"abort"</span><span class="nb-shiki-140thh">, () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"The request was aborted!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">readable</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">writable</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> IdentityTransformStream</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> sendPing</span><span class="nb-shiki-140thh">(writable);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(readable, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> sendPing</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">writable</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> writable.</span><span class="nb-shiki-1t8gfj">getWriter</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> enc</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (;;) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Send 'ping' every second to keep the connection alive</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(enc.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"ping</span><span class="nb-shiki-dzsirb">\r\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> scheduler.</span><span class="nb-shiki-1t8gfj">wait</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // This sets up an event listener that will be called if the client disconnects from your</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // worker.</span></span> <span class="line"><span class="nb-shiki-140thh"> request.signal.</span><span class="nb-shiki-1t8gfj">addEventListener</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'abort'</span><span class="nb-shiki-140thh">, () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'The request was aborted!'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">readable</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">writable</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> IdentityTransformStream</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> sendPing</span><span class="nb-shiki-140thh">(writable);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(readable, { headers: { </span><span class="nb-shiki-mdbnqw">'Content-Type'</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">'text/plain'</span><span class="nb-shiki-140thh"> } });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">>;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> sendPing</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">writable</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WritableStream</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-dzsirb">void</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> writable.</span><span class="nb-shiki-1t8gfj">getWriter</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> enc</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (;;) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Send 'ping' every second to keep the connection alive</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(enc.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'ping</span><span class="nb-shiki-dzsirb">\r\n</span><span class="nb-shiki-mdbnqw">'</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> scheduler.</span><span class="nb-shiki-1t8gfj">wait</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>For more information see the <a href="https://developers.cloudflare.com/workers/runtime-apis/request"><code>Request</code> documentation</a>.</p>Thu, 22 May 2025 00:00:00 GMTWorkersWorkersCloudflare Fundamentals, Terraform - Terraform v5.5.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-05-19-terraform-v5.5.0-provider/https://developers.cloudflare.com/changelog/post/2025-05-19-terraform-v5.5.0-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. Unlike the earlier Terraform providers, v5 is automatically generated based on the OpenAPI Schemas for our REST APIs. Since launch, we have seen an unexpectedly high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by customers. These issues currently impact about 15% of resources. We have been working diligently to address these issues across the company, and have released the v5.5.0 release which includes a number of bug fixes. Please keep an eye on this changelog for more information about upcoming releases.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Broad fixes across resources with recurring diffs, including, but not limited to: <ul> <li><code>cloudflare_zero_trust_gateway_policy</code></li> <li><code>cloudflare_zero_trust_access_application</code></li> <li><code>cloudflare_zero_trust_tunnel_cloudflared_route</code></li> <li><code>cloudflare_zone_setting</code></li> <li><code>cloudflare_ruleset</code></li> <li><code>cloudflare_page_rule</code></li> </ul> </li> <li>Zone settings can be re-applied without client errors</li> <li>Page rules conversion errors are fixed</li> <li>Failure to apply changes to <code>cloudflare_zero_trust_tunnel_cloudflared_route</code></li> <li>Other bug fixes</li> </ul> <p>For a more detailed look at all of the changes, see the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.5.0" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> in GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="issues-closed">Issues Closed</h4><a class="anchor-link" href="#issues-closed"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5304" target="_blank" rel="noopener">#5304: Importing cloudflare_zero_trust_gateway_policy invalid attribute filter value<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5303" target="_blank" rel="noopener">#5303: cloudflare_page_rule import does not set values for all of the fields in terraform state<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5178" target="_blank" rel="noopener">#5178: cloudflare_page_rule Page rule creation with redirect fails<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5336" target="_blank" rel="noopener">#5336: cloudflare_turnstile_wwidget not able to update<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5418" target="_blank" rel="noopener">#5418: cloudflare_cloud_connector_rules: Provider returned invalid result object after apply<span class="external-link"> ↗</span></a></li> <li><a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5423" target="_blank" rel="noopener">#5423: cloudflare_zone_setting: "Invalid value for zone setting always_use_https"<span class="external-link"> ↗</span></a></li> </ul> <p>If you have an unaddressed issue with the provider, we encourage you to check the <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues" target="_blank" rel="noopener">open issues<span class="external-link"> ↗</span></a> and open a new one if one does not already exist for what you are experiencing.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are evaluating a move from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition, although these do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/">Documentation on using Terraform with Cloudflare</a></li> </ul>Mon, 19 May 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - WAF Release - 2025-05-19https://developers.cloudflare.com/changelog/post/2025-05-19-waf-release/https://developers.cloudflare.com/changelog/post/2025-05-19-waf-release/ <p>This week's analysis covers four vulnerabilities, with three rated critical due to their Remote Code Execution (RCE) potential. One targets a high-traffic frontend platform, while another targets a popular content management system. These detections are now part of the Cloudflare Managed Ruleset in <em>Block</em> mode.</p> <p><strong>Key Findings</strong></p> <ul> <li>Commvault Command Center (CVE-2025-34028) exposes an unauthenticated RCE via insecure command injection paths in the web UI. This is critical due to its use in enterprise backup environments.</li> <li>BentoML (CVE-2025-27520) reveals an exploitable vector where serialized payloads in model deployment APIs can lead to arbitrary command execution. This targets modern AI/ML infrastructure.</li> <li>Craft CMS (CVE-2024-56145) allows RCE through template injection in unauthenticated endpoints. It poses a significant risk for content-heavy websites with plugin extensions.</li> <li>Apache HTTP Server (CVE-2024-38475) discloses sensitive server config data due to misconfigured <code>mod_proxy</code> behavior. While not RCE, this is useful for pre-attack recon.</li> </ul> <p><strong>Impact</strong></p> <p>These newly detected vulnerabilities introduce critical risk across modern web stacks, AI infrastructure, and content platforms: unauthenticated RCEs in Commvault, BentoML, and Craft CMS enable full system compromise with minimal attacker effort.</p> <p>Apache HTTPD information leak can support targeted reconnaissance, increasing the success rate of follow-up exploits. Organizations using these platforms should prioritize patching and monitor for indicators of exploitation using updated WAF detection rules.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5c3559ad62994e5b932d7d0075129820"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...75129820</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100745</td><td>Apache HTTP Server - Information Disclosure - CVE:CVE-2024-38475</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="28a22a685bba478d99bc904526a517f1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...26a517f1</span></button></rule-id></td><td>100747</td><td><p>Commvault Command Center - Remote Code Execution - CVE:CVE-2025-34028</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2e6bb954d0634e368c49d7d1d7619ccb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d7619ccb</span></button></rule-id></td><td>100749</td><td>BentoML - Remote Code Execution - CVE:CVE-2025-27520</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="91250eebec894705b62305b2f15bfda4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f15bfda4</span></button></rule-id></td><td>100753</td><td>Craft CMS - Remote Code Execution - CVE:CVE-2024-56145</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 19 May 2025 00:00:00 GMTWAFWAFCloudflare One - New Applications Added to Zero Trusthttps://developers.cloudflare.com/changelog/post/new-applications-71825/https://developers.cloudflare.com/changelog/post/new-applications-71825/<p>42 new applications have been added for Zero Trust support within the Application Library and Gateway policy enforcement, giving you the ability to investigate or apply inline policies to these applications.</p> <p>33 of the 42 applications are Artificial Intelligence applications. The others are Human Resources (2 applications), Development (2 applications), Productivity (2 applications), Sales &amp; Marketing, Public Cloud, and Security.</p> <p>To view all available applications, log in to your Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>, navigate to the <strong>App Library</strong> under <strong>My Team</strong>.</p> <p>For more information on creating Gateway policies, see our <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/">Gateway policy documentation</a>.</p>Sun, 18 May 2025 00:00:00 GMTCloudflare OneCloudflare OneAccess, Cloudflare One - New Access Analytics in the Cloudflare One Dashboardhttps://developers.cloudflare.com/changelog/post/access-analytics-v2/https://developers.cloudflare.com/changelog/post/access-analytics-v2/<p>A new Access Analytics dashboard is now available to all Cloudflare One customers. Customers can apply and combine multiple filters to dive into specific slices of their Access metrics. These filters include:</p> <ul> <li>Logins granted and denied</li> <li>Access events by type (SSO, Login, Logout)</li> <li>Application name (Salesforce, Jira, Slack, etc.)</li> <li>Identity provider (Okta, Google, Microsoft, onetimepin, etc.)</li> <li>Users (<code>chris@cloudflare.com</code>, <code>sally@cloudflare.com</code>, <code>rachel@cloudflare.com</code>, etc.)</li> <li>Countries (US, CA, UK, FR, BR, CN, etc.)</li> <li>Source IP address</li> <li>App type (self-hosted, Infrastructure, RDP, etc.)</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2030,height=1720,format=webp/_astro/accessanalytics.DYXgwZCl.png" alt="Access Analytics" loading="lazy" decoding="async" width="2030" height="1720"> <p>To access the new overview, log in to your Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a> and find Analytics in the side navigation bar.</p>Fri, 16 May 2025 00:00:00 GMTAccessAccessCloudflare OneWorkers, Durable Objects - Durable Objects are now supported in Python Workershttps://developers.cloudflare.com/changelog/post/2025-05-14-python-worker-durable-object/https://developers.cloudflare.com/changelog/post/2025-05-14-python-worker-durable-object/ <p>You can now create <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a> using <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers</a>. A Durable Object is a special kind of Cloudflare Worker which uniquely combines compute with storage, enabling stateful long-running applications which run close to your users. For more info see <a href="https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/">here</a>.</p> <p>You can define a Durable Object in Python in a similar way to JavaScript:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> DurableObject, Response, WorkerEntrypoint</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> urllib.parse </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> urlparse</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> MyDurableObject</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">DurableObject</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-dzsirb"> __init__</span><span class="nb-shiki-140thh">(self, ctx, env):</span></span> <span class="line"><span class="nb-shiki-dzsirb"> self</span><span class="nb-shiki-140thh">.ctx </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> ctx</span></span> <span class="line"><span class="nb-shiki-dzsirb"> self</span><span class="nb-shiki-140thh">.env </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> env</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(self, request):</span></span> <span class="line"><span class="nb-shiki-140thh"> result </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> self</span><span class="nb-shiki-140thh">.ctx.storage.sql.exec(</span><span class="nb-shiki-mdbnqw">"SELECT 'Hello, World!' as greeting"</span><span class="nb-shiki-140thh">).one()</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response(result.greeting)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> Default</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">WorkerEntrypoint</span><span class="nb-shiki-140thh">):</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(self, request):</span></span> <span class="line"><span class="nb-shiki-140thh"> url </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> urlparse(request.url)</span></span> <span class="line"><span class="nb-shiki-dzsirb"> id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.idFromName(url.path)</span></span> <span class="line"><span class="nb-shiki-140thh"> stub </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.get(</span><span class="nb-shiki-dzsirb">id</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> greeting </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.fetch(request.url)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> greeting</span></span></code></pre></figure> <p>Define the Durable Object in your Wrangler configuration file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "durable_objects"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "bindings"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MY_DURABLE_OBJECT"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "class_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"MyDurableObject"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">durable_objects</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">bindings</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">name = </span><span class="nb-shiki-mdbnqw">"MY_DURABLE_OBJECT"</span></span> <span class="line"><span class="nb-shiki-140thh">class_name = </span><span class="nb-shiki-mdbnqw">"MyDurableObject"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Then define the storage backend for your Durable Object:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "migrations"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tag"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"v1"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Should be unique for each entry</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "new_sqlite_classes"</span><span class="nb-shiki-140thh">: [ </span><span class="nb-shiki-21nrsd">// Array of new classes</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "MyDurableObject"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">migrations</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">tag = </span><span class="nb-shiki-mdbnqw">"v1"</span></span> <span class="line"><span class="nb-shiki-140thh">new_sqlite_classes = [ </span><span class="nb-shiki-mdbnqw">"MyDurableObject"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div> <p>Then test your new Durable Object locally by running <code>wrangler dev</code>:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> dev</span></span></code></pre></figure> <p>Consult the <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects documentation</a> for more details.</p>Fri, 16 May 2025 00:00:00 GMTWorkersWorkersDurable ObjectsEmail security - Open email attachments with Browser Isolationhttps://developers.cloudflare.com/changelog/post/2025-05-08-open-attachments-with-browser-isolation/https://developers.cloudflare.com/changelog/post/2025-05-08-open-attachments-with-browser-isolation/<p>You can now safely open email attachments to view and investigate them.</p> <p>What this means is that messages now have a <strong>Attachments</strong> section. Here, you can view processed attachments and their classifications (for example, <em>Malicious</em>, <em>Suspicious</em>, <em>Encrypted</em>). Next to each attachment, a <strong>Browser Isolation</strong> icon allows your team to safely open the file in a <strong>clientless, isolated browser</strong> with no risk to the analyst or your environment.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=517,height=155,format=webp/_astro/Attachment-RBI.U9Dp8dJO.png" alt="Attachment-RBI" loading="lazy" decoding="async" width="517" height="155"> <p>To use this feature, you must:</p> <ul> <li>Turn on <strong>Allow users to open a remote browser without the device client</strong> in your Zero Trust settings.</li> <li>Have <strong>Browser Isolation (BISO)</strong> seats assigned.</li> </ul> <p>For more details, refer to our <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/">setup guide</a>.</p> <p>Some attachment types may not render in Browser Isolation. If there is a file type that you would like to be opened with Browser Isolation, reach out to your Cloudflare contact.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 15 May 2025 23:22:49 GMTEmail securityEmail securityGateway - Domain Categories improvementshttps://developers.cloudflare.com/changelog/post/2025-05-14-domain-category-improvements/https://developers.cloudflare.com/changelog/post/2025-05-14-domain-category-improvements/<p><strong>New categories added</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Parent ID</th> <th>Parent Name</th> <th>Category ID</th> <th>Category Name</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Ads</td> <td>66</td> <td>Advertisements</td> </tr> <tr> <td>3</td> <td>Business &amp; Economy</td> <td>185</td> <td>Personal Finance</td> </tr> <tr> <td>3</td> <td>Business &amp; Economy</td> <td>186</td> <td>Brokerage &amp; Investing</td> </tr> <tr> <td>21</td> <td>Security Threats</td> <td>187</td> <td>Compromised Domain</td> </tr> <tr> <td>21</td> <td>Security Threats</td> <td>188</td> <td>Potentially Unwanted Software</td> </tr> <tr> <td>6</td> <td>Education</td> <td>189</td> <td>Reference</td> </tr> <tr> <td>9</td> <td>Government &amp; Politics</td> <td>190</td> <td>Charity and Non-profit</td> </tr> </tbody> </table></div> <p><strong>Changes to existing categories</strong></p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th>Original Name</th> <th>New Name</th> </tr> </thead> <tbody> <tr> <td>Religion</td> <td>Religion &amp; Spirituality</td> </tr> <tr> <td>Government</td> <td>Government/Legal</td> </tr> <tr> <td>Redirect</td> <td>URL Alias/Redirect</td> </tr> </tbody> </table></div> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/domain-categories/">Gateway domain categories</a> to learn more.</p>Wed, 14 May 2025 00:00:00 GMTGatewayGatewayHyperdrive - Hyperdrive achieves FedRAMP Moderate-Impact Authorizationhttps://developers.cloudflare.com/changelog/post/2025-05-14-hyperdrive-fedramp/https://developers.cloudflare.com/changelog/post/2025-05-14-hyperdrive-fedramp/ <p>Hyperdrive has been approved for FedRAMP Authorization and is now available in the <a href="https://marketplace.fedramp.gov/products/FR2000863987" target="_blank" rel="noopener">FedRAMP Marketplace<span class="external-link"> ↗</span></a>.</p> <p>FedRAMP is a U.S. government program that provides standardized assessment and authorization for cloud products and services. As a result of this product update, Hyperdrive has been approved as an authorized service to be used by U.S. federal agencies at the Moderate Impact level.</p> <p>For detailed information regarding FedRAMP and its implications, please refer to the <a href="https://marketplace.fedramp.gov/products/FR2000863987" target="_blank" rel="noopener">official FedRAMP documentation for Cloudflare<span class="external-link"> ↗</span></a>.</p>Wed, 14 May 2025 00:00:00 GMTHyperdriveHyperdriveStream - Introducing Origin Restrictions for Media Transformationshttps://developers.cloudflare.com/changelog/post/2025-05-14-media-transformations-origin-restrictions/https://developers.cloudflare.com/changelog/post/2025-05-14-media-transformations-origin-restrictions/<p>We are adding <a href="https://developers.cloudflare.com/stream/transform-videos/sources/">source origin restrictions</a> to the Media Transformations beta. This allows customers to restrict what sources can be used to fetch images and video for transformations. This feature is the same as --- and uses the same settings as --- <a href="https://developers.cloudflare.com/images/optimization/transformations/sources/">Image Transformations sources</a>.</p> <p>When transformations is first enabled, the default setting only allows transformations on images and media from the same website or domain being used to make the transformation request. In other words, by default, requests to <code>example.com/cdn-cgi/media</code> can only reference originals on <code>example.com</code>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1664,height=872,format=webp/_astro/allowed-origins.4hu5lHws.png" alt="Enable allowed origins from the Cloudflare dashboard" loading="lazy" decoding="async" width="1664" height="872"> <p>Adding access to other sources, or allowing any source, <a href="https://developers.cloudflare.com/images/optimization/transformations/sources/">is easy to do</a> in the <strong>Transformations</strong> tab under <strong>Stream</strong>. Click each domain enabled for Transformations and set its sources list to match the needs of your content. The user making this change will need permission to edit zone settings.</p> <p>For more information, learn about <a href="https://developers.cloudflare.com/stream/transform-videos/">Transforming Videos</a>.</p>Wed, 14 May 2025 00:00:00 GMTStreamStreamBrowser Isolation - SAML HTTP-POST bindings support for RBIhttps://developers.cloudflare.com/changelog/post/2025-05-13-rbi-saml-post-support/https://developers.cloudflare.com/changelog/post/2025-05-13-rbi-saml-post-support/<p>Remote Browser Isolation (RBI) now supports SAML HTTP-POST bindings, enabling seamless authentication for SSO-enabled applications that rely on POST-based SAML responses from Identity Providers (IdPs) within a Remote Browser Isolation session. This update resolves a previous limitation that caused <code>405</code> errors during login and improves compatibility with multi-factor authentication (MFA) flows.</p> <p>With expanded support for major IdPs like Okta and Azure AD, this enhancement delivers a more consistent and user-friendly experience across authentication workflows. Learn how to <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/">set up Remote Browser Isolation</a>.</p>Tue, 13 May 2025 00:00:00 GMTBrowser IsolationBrowser IsolationGateway - New Applications Added for DNS Filteringhttps://developers.cloudflare.com/changelog/post/2025-05-13-new-applications-added/https://developers.cloudflare.com/changelog/post/2025-05-13-new-applications-added/<p>You can now create DNS policies to manage outbound traffic for an expanded list of applications. This update adds support for 273 new applications, giving you more control over your organization's outbound traffic.</p> <p>With this update, you can:</p> <ul> <li>Create DNS policies for a wider range of applications</li> <li>Manage outbound traffic more effectively</li> <li>Improve your organization's security and compliance posture</li> </ul> <p>For more information on creating DNS policies, see our <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/">DNS policy documentation</a>.</p>Tue, 13 May 2025 00:00:00 GMTGatewayGatewayData Loss Prevention - Case Sensitive Custom Word Listshttps://developers.cloudflare.com/changelog/post/2025-05-12-case-sensitive-cwl/https://developers.cloudflare.com/changelog/post/2025-05-12-case-sensitive-cwl/<p>You can now configure <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#custom-wordlist-datasets">custom word lists</a> to enforce case sensitivity. This setting supports flexibility where needed and aims to reduce false positives where letter casing is critical.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1289,height=910,format=webp/_astro/case-sesitive-cwl.MPuOc_3r.png" alt="dlp" loading="lazy" decoding="async" width="1289" height="910">Mon, 12 May 2025 00:00:00 GMTData Loss PreventionData Loss PreventionQueues - Publish messages to Queues directly via HTTPhttps://developers.cloudflare.com/changelog/post/2025-05-09-publish-to-queues-via-http/https://developers.cloudflare.com/changelog/post/2025-05-09-publish-to-queues-via-http/<p>You can now publish messages to <a href="https://developers.cloudflare.com/queues/">Cloudflare Queues</a> directly via HTTP from any service or programming language that supports sending HTTP requests. Previously, publishing to queues was only possible from within <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>. You can already consume from queues via Workers or <a href="https://developers.cloudflare.com/queues/configuration/pull-consumers/">HTTP pull consumers</a>, and now publishing is just as flexible.</p> <p>Publishing via HTTP requires a <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">Cloudflare API token</a> with <code>Queues Edit</code> permissions for authentication. Here's a simple example:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/queues/&lt;queue_id&gt;/messages"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;api_token&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{ "body": { "greeting": "hello", "timestamp": "2025-07-24T12:00:00Z"} }'</span></span></code></pre></figure> <p>You can also use our <a href="https://developers.cloudflare.com/fundamentals/api/reference/sdks/">SDKs</a> for TypeScript, Python, and Go.</p> <p>To get started with HTTP publishing, check out our <a href="https://developers.cloudflare.com/queues/examples/publish-to-a-queue-via-http/">step-by-step example</a> and the full API documentation in our <a href="https://developers.cloudflare.com/api/resources/queues/subresources/messages/methods/push/">API reference</a>.</p>Fri, 09 May 2025 12:00:00 GMTQueuesQueuesRules - More ways to match — Snippets now support Custom Lists, Bot Score, and WAF Attack Scorehttps://developers.cloudflare.com/changelog/post/2025-05-09-snippets-cloud-connector-lists-waf-bot-scores/https://developers.cloudflare.com/changelog/post/2025-05-09-snippets-cloud-connector-lists-waf-bot-scores/<p>You can now use IP, Autonomous System (AS), and Hostname <a href="https://developers.cloudflare.com/waf/tools/lists/custom-lists/">custom lists</a> to route traffic to <a href="https://developers.cloudflare.com/rules/snippets/">Snippets</a> and <a href="https://developers.cloudflare.com/rules/cloud-connector/">Cloud Connector</a>, giving you greater precision and control over how you match and process requests at the edge.</p> <p>In Snippets, you can now also match on <a href="https://developers.cloudflare.com/bots/concepts/bot-score/">Bot Score</a> and <a href="https://developers.cloudflare.com/waf/detections/attack-score/">WAF Attack Score</a>, unlocking smarter edge logic for everything from request filtering and mitigation to <a href="https://developers.cloudflare.com/rules/snippets/examples/slow-suspicious-requests/">tarpitting</a> and logging.</p> <p><strong>What’s new:</strong></p> <ul> <li><a href="https://developers.cloudflare.com/waf/tools/lists/custom-lists/">Custom lists</a> matching – Snippets and Cloud Connector now support user-created IP, AS, and Hostname lists via dashboard or <a href="https://developers.cloudflare.com/api/resources/rules/subresources/lists/methods/list/">Lists API</a>. Great for shared logic across zones.</li> <li><a href="https://developers.cloudflare.com/bots/concepts/bot-score/">Bot Score</a> and <a href="https://developers.cloudflare.com/waf/detections/attack-score/">WAF Attack Score</a> – Use Cloudflare’s intelligent traffic signals to detect bots or attacks and take advanced, tailored actions with just a few lines of code.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1383,height=1351,format=webp/_astro/snippets-lists-scores.D05l6zgc.png" alt="New fields in Snippets" loading="lazy" decoding="async" width="1383" height="1351"> <p>These enhancements unlock new possibilities for building smarter traffic workflows with minimal code and maximum efficiency.</p> <p>Learn more in the <a href="https://developers.cloudflare.com/rules/snippets/">Snippets</a> and <a href="https://developers.cloudflare.com/rules/cloud-connector/">Cloud Connector</a> documentation.</p>Fri, 09 May 2025 00:00:00 GMTRulesRulesEmail security - Open email links with Browser Isolationhttps://developers.cloudflare.com/changelog/post/2025-05-15-open-links-browser-isolation/https://developers.cloudflare.com/changelog/post/2025-05-15-open-links-browser-isolation/<p>You can now safely open links in emails to view and investigate them.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=558,height=204,format=webp/_astro/investigate-links.pYbpGkt5.jpg" alt="Open links with Browser Isolation" loading="lazy" decoding="async" width="558" height="204"> <p>From <strong>Investigation</strong>, go to <strong>View details</strong>, and look for the <strong>Links identified</strong> section. Next to each link, the Cloudflare dashboard will display an <strong>Open in Browser Isolation</strong> icon which allows your team to safely open the link in a clientless, isolated browser with no risk to the analyst or your environment. Refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/investigation/search-email/#open-links">Open links</a> to learn more about this feature.</p> <p>To use this feature, you must:</p> <ul> <li>Turn on <strong>Allow users to open a remote browser without the device client</strong> in your Zero Trust settings.</li> <li>Have <strong>Browser Isolation (RBI)</strong> seats assigned.</li> </ul> <p>For more details, refer to our <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/">setup guide</a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 08 May 2025 23:22:49 GMTEmail securityEmail securitySecurity Center - URL Scanner now supports geo-specific scanninghttps://developers.cloudflare.com/changelog/post/2025-05-07-url-scanner-geoegress/https://developers.cloudflare.com/changelog/post/2025-05-07-url-scanner-geoegress/<p>Enterprise customers can now choose the geographic location from which a URL scan is performed — either via <a href="https://developers.cloudflare.com/security-center/investigate/">Security Center</a> in the Cloudflare dashboard or via the <a href="https://developers.cloudflare.com/api/resources/url_scanner/subresources/scans/methods/create/">URL Scanner API</a>.</p> <p>This feature gives security teams greater insight into how a website behaves across different regions, helping uncover targeted, location-specific threats.</p> <p><strong>What’s new:</strong></p> <ul> <li>Location Picker: Select a location for the scan via <strong>Security Center → Investigate</strong> in the dashboard or through the API.</li> <li>Region-aware scanning: Understand how content changes by location — useful for detecting regionally tailored attacks.</li> <li>Default behavior: If no location is set, scans default to the user’s current geographic region.</li> </ul> <p>Learn more in the <a href="https://developers.cloudflare.com/security-center/">Security Center documentation</a>.</p>Thu, 08 May 2025 00:00:00 GMTSecurity CenterSecurity CenterWAF - Improved Payload Logging for WAF Managed Ruleshttps://developers.cloudflare.com/changelog/post/2025-05-08-improved-payload-logging/https://developers.cloudflare.com/changelog/post/2025-05-08-improved-payload-logging/<p>We have upgraded WAF Payload Logging to enhance rule diagnostics and usability:</p> <ul> <li><strong>Targeted logging</strong>: Logs now capture only the specific portions of requests that triggered WAF rules, rather than entire request segments.</li> <li><strong>Visual highlighting</strong>: Matched content is visually highlighted in the UI for faster identification.</li> <li><strong>Enhanced context</strong>: Logs now include surrounding context to make diagnostics more effective.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=751,format=webp/_astro/2025-05-payload-logging-update.1M29LjNm.png" alt="Log entry showing payload logging details" loading="lazy" decoding="async" width="1600" height="751"> <p>Payload Logging is available to all Enterprise customers. If you have not used Payload Logging before, check how you can <a href="https://developers.cloudflare.com/waf/managed-rules/payload-logging/">get started</a>.</p> <p><strong>Note:</strong> The structure of the <code>encrypted_matched_data</code> field in Logpush has changed from <code>Map&lt;Field, Value&gt;</code> to <code>Map&lt;Field, {Before: bytes, Content: Value, After: bytes}&gt;</code>. If you rely on this field in your Logpush jobs, you should review and update your processing logic accordingly.</p>Thu, 08 May 2025 00:00:00 GMTWAFWAFWorkers - Improved memory efficiency for WebAssembly Workershttps://developers.cloudflare.com/changelog/post/2025-05-08-finalization-registry/https://developers.cloudflare.com/changelog/post/2025-05-08-finalization-registry/<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry" target="_blank" rel="noopener">FinalizationRegistry<span class="external-link"> ↗</span></a> is now available in Workers. You can opt-in using the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref"><code>enable_weak_ref</code></a> compatibility flag.</p> <p>This can reduce memory leaks when using WebAssembly-based Workers, which includes <a href="https://developers.cloudflare.com/workers/languages/python/">Python Workers</a> and <a href="https://developers.cloudflare.com/workers/languages/rust/">Rust Workers</a>. The FinalizationRegistry works by enabling toolchains such as <a href="https://emscripten.org/" target="_blank" rel="noopener">Emscripten<span class="external-link"> ↗</span></a> and <a href="https://wasm-bindgen.github.io/wasm-bindgen/" target="_blank" rel="noopener">wasm-bindgen<span class="external-link"> ↗</span></a> to automatically free WebAssembly heap allocations. If you are using WASM and seeing Exceeded Memory errors and cannot determine a cause using <a href="https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/">memory profiling</a>, you may want to enable the FinalizationRegistry.</p> <p>For more information refer to the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-finalizationregistry-and-weakref"><code>enable_weak_ref</code></a> compatibility flag documentation.</p>Thu, 08 May 2025 00:00:00 GMTWorkersWorkersData Loss Prevention - Send forensic copies to storage without DLP profileshttps://developers.cloudflare.com/changelog/post/2025-05-07-forensic-copy-update/https://developers.cloudflare.com/changelog/post/2025-05-07-forensic-copy-update/<p>You can now <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-policies/logging-options/#send-dlp-forensic-copies-to-logpush-destination">send DLP forensic copies</a> to third-party storage for any HTTP policy with an <code>Allow</code> or <code>Block</code> action, without needing to include a DLP profile. This change increases flexibility for data handling and forensic investigation use cases.</p> <p>By default, Gateway will send all matched HTTP requests to your configured DLP Forensic Copy jobs.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1324,height=636,format=webp/_astro/forensic-copies-for-all.fxeFrCY4.png" alt="DLP" loading="lazy" decoding="async" width="1324" height="636">Wed, 07 May 2025 00:00:00 GMTData Loss PreventionData Loss PreventionLoad Balancing - UDP and ICMP Monitor Support for Private Load Balancing Endpointshttps://developers.cloudflare.com/changelog/post/2025-05-06-private-health-monitoring-methods/https://developers.cloudflare.com/changelog/post/2025-05-06-private-health-monitoring-methods/<p>Cloudflare Load Balancing now supports <strong>UDP (Layer 4)</strong> and <strong>ICMP (Layer 3)</strong> health monitors for <strong>private endpoints</strong>. This makes it simple to track the health and availability of internal services that don’t respond to HTTP, TCP, or other protocol probes.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-can-do">What you can do:</h4><a class="anchor-link" href="#what-you-can-do"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Set up <strong>ICMP ping monitors</strong> to check if your private endpoints are reachable.</li> <li>Use <strong>UDP monitors</strong> for lightweight health checks on non-TCP workloads, such as DNS, VoIP, or custom UDP-based services.</li> <li>Gain better visibility and uptime guarantees for services running behind <strong>Private Network Load Balancing</strong>, without requiring public IP addresses.</li> </ul> <p>This enhancement is ideal for internal applications that rely on low-level protocols, especially when used in conjunction with <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/"><strong>Cloudflare Tunnel</strong></a>, <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/"><strong>WARP</strong></a>, and <a href="https://developers.cloudflare.com/cloudflare-wan/"><strong>Magic WAN</strong></a> to create a secure and observable private network.</p> <p>Learn more about <a href="https://developers.cloudflare.com/load-balancing/private-network/">Private Network Load Balancing</a> or view the full list of <a href="https://developers.cloudflare.com/load-balancing/monitors/#supported-protocols">supported health monitor protocols</a>.</p>Tue, 06 May 2025 00:00:00 GMTLoad BalancingLoad BalancingCloudflare Fundamentals, Terraform - Terraform v5.4.0 now availablehttps://developers.cloudflare.com/changelog/post/2025-05-06-terraform-v5.4.0-provider/https://developers.cloudflare.com/changelog/post/2025-05-06-terraform-v5.4.0-provider/<p>Earlier this year, we announced the launch of the new <a href="https://developers.cloudflare.com/changelog/2025-02-03-terraform-v5-provider/">Terraform v5 Provider</a>. Unlike the earlier Terraform providers, v5 is automatically generated based on the OpenAPI Schemas for our REST APIs. Since launch, we have seen an unexpectedly high number of <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">issues<span class="external-link"> ↗</span></a> reported by customers. These issues currently impact about 15% of resources. We have been working diligently to address these issues across the company, and have released the v5.4.0 release which includes a number of bug fixes. Please keep an eye on this changelog for more information about upcoming releases.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="changes">Changes</h4><a class="anchor-link" href="#changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Removes the <code>worker_platforms_script_secret</code> resource from the provider (see <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade#cloudflare_worker_secret" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a> for alternatives—applicable to both Workers and Workers for Platforms)</li> <li>Removes duplicated fields in <code>cloudflare_cloud_connector_rules</code> resource</li> <li>Fixes <code>cloudflare_workers_route</code> id issues <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5134" target="_blank" rel="noopener">#5134<span class="external-link"> ↗</span></a> <a href="https://github.com/cloudflare/terraform-provider-cloudflare/issues/5501" target="_blank" rel="noopener">#5501<span class="external-link"> ↗</span></a></li> <li>Fixes issue around refreshing resources that have unsupported response types <details><summary>Affected resources</summary><ul><li><code>cloudflare_certificate_pack</code></li><li><code>cloudflare_registrar_domain</code></li><li><code>cloudflare_stream_download</code></li><li><code>cloudflare_stream_webhook</code></li><li><code>cloudflare_user</code></li><li><code>cloudflare_workers_kv</code></li><li><code>cloudflare_workers_script</code></li></ul></details> </li> <li>Fixes <code>cloudflare_workers_kv</code> state refresh issues</li> <li>Fixes issues around configurability of nested properties without computed values for the following resources <details><summary>Affected resources</summary><ul><li><code>cloudflare_account</code></li><li><code>cloudflare_account_dns_settings</code></li><li><code>cloudflare_account_token</code></li><li><code>cloudflare_api_token</code></li><li><code>cloudflare_cloud_connector_rules</code></li><li><code>cloudflare_custom_ssl</code></li><li><code>cloudflare_d1_database</code></li><li><code>cloudflare_dns_record</code></li><li><code>email_security_trusted_domains</code></li><li><code>cloudflare_hyperdrive_config</code></li><li><code>cloudflare_keyless_certificate</code></li><li><code>cloudflare_list_item</code></li><li><code>cloudflare_load_balancer</code></li><li><code>cloudflare_logpush_dataset_job</code></li><li><code>cloudflare_magic_network_monitoring_configuration</code></li><li><code>cloudflare_magic_transit_site</code></li><li><code>cloudflare_magic_transit_site_lan</code></li><li><code>cloudflare_magic_transit_site_wan</code></li><li><code>cloudflare_magic_wan_static_route</code></li><li><code>cloudflare_notification_policy</code></li><li><code>cloudflare_pages_project</code></li><li><code>cloudflare_queue</code></li><li><code>cloudflare_queue_consumer</code></li><li><code>cloudflare_r2_bucket_cors</code></li><li><code>cloudflare_r2_bucket_event_notification</code></li><li><code>cloudflare_r2_bucket_lifecycle</code></li><li><code>cloudflare_r2_bucket_lock</code></li><li><code>cloudflare_r2_bucket_sippy</code></li><li><code>cloudflare_ruleset</code></li><li><code>cloudflare_snippet_rules</code></li><li><code>cloudflare_snippets</code></li><li><code>cloudflare_spectrum_application</code></li><li><code>cloudflare_workers_deployment</code></li><li><code>cloudflare_zero_trust_access_application</code></li><li><code>cloudflare_zero_trust_access_group</code></li></ul></details> </li> <li>Fixed defaults that made <code>cloudflare_workers_script</code> fail when using Assets</li> <li>Fixed Workers Logpush setting in <code>cloudflare_workers_script</code> mistakenly being readonly</li> <li>Fixed <code>cloudflare_pages_project</code> broken when using "source"</li> </ul> <p>The detailed <a href="https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.4.0" target="_blank" rel="noopener">changelog<span class="external-link"> ↗</span></a> is available on GitHub.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="upgrading">Upgrading</h4><a class="anchor-link" href="#upgrading"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you are evaluating a move from v4 to v5, please make use of the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">migration guide<span class="external-link"> ↗</span></a>. We have provided automated migration scripts using Grit which simplify the transition, although these do not support implementations which use Terraform modules, so customers making use of modules need to migrate manually. Please make use of <code>terraform plan</code> to test your changes before applying, and let us know if you encounter any additional issues either by reporting to our <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">GitHub repository<span class="external-link"> ↗</span></a>, or by opening a <a href="https://www.support.cloudflare.com/s/?language=en_US" target="_blank" rel="noopener">support ticket<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="for-more-info">For more info</h4><a class="anchor-link" href="#for-more-info"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/" target="_blank" rel="noopener">Documentation on using Terraform with Cloudflare<span class="external-link"> ↗</span></a></li> </ul>Tue, 06 May 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWAF - WAF Release - 2025-05-05https://developers.cloudflare.com/changelog/post/2025-05-05-waf-release/https://developers.cloudflare.com/changelog/post/2025-05-05-waf-release/ <p>This week's analysis covers five CVEs with varying impact levels. Four are rated critical, while one is rated high severity. Remote Code Execution vulnerabilities dominate this set.</p> <p><strong>Key Findings</strong></p> <p>GFI KerioControl (CVE-2024-52875) contains an unauthenticated Remote Code Execution (RCE) vulnerability that targets firewall appliances. This vulnerability can let attackers gain root level system access, making this CVE particularly attractive for threat actors.</p> <p>The SonicWall SMA vulnerabilities remain concerning due to their continued exploitation since 2021. These critical vulnerabilities in remote access solutions create dangerous entry points to networks.</p> <p><strong>Impact</strong></p> <p>Customers using the Managed Ruleset will receive rule coverage following this week's release. Below is a breakdown of the recommended prioritization based on current exploitation trends:</p> <ul> <li>GFI KerioControl (CVE-2024-52875) - Highest priority; unauthenticated RCE</li> <li>SonicWall SMA (Multiple vulnerabilities) - Critical for network appliances</li> <li>XWiki (CVE-2025-24893) - High priority for development environments</li> <li>Langflow (CVE-2025-3248) - Important for AI workflow platforms</li> <li>MinIO (CVE-2025-31489) - Important for object storage implementations</li> </ul> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="921660147baa48eaa9151077d0b7a392"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d0b7a392</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100724</td><td>GFI KerioControl - Remote Code Execution - CVE:CVE-2024-52875</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a3900934273b4a488111f810717a9e42"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...717a9e42</span></button></rule-id></td><td>100748</td><td>XWiki - Remote Code Execution - CVE:CVE-2025-24893</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="616ad0e03892473191ca1df4e9cf745d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e9cf745d</span></button></rule-id></td><td>100750</td><td><p>SonicWall SMA - Dangerous File Upload - CVE:CVE-2021-20040, CVE:CVE-2021-20041, CVE:CVE-2021-20042</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1a11fbe84b49451193ee1ee6d29da333"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d29da333</span></button></rule-id></td><td>100751</td><td>Langflow - Remote Code Execution - CVE:CVE-2025-3248</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5eb7ed601e6844828b9bdb05caa7b208"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...caa7b208</span></button></rule-id></td><td>100752</td><td>MinIO - Auth Bypass - CVE:CVE-2025-31489</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 05 May 2025 00:00:00 GMTWAFWAFBrowser Isolation - Browser Isolation Overview page for Zero Trusthttps://developers.cloudflare.com/changelog/post/2025-05-01-browser-isolation-overview-page/https://developers.cloudflare.com/changelog/post/2025-05-01-browser-isolation-overview-page/<p>A new <strong>Browser Isolation Overview</strong> page is now available in the Cloudflare Zero Trust dashboard. This centralized view simplifies the management of <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">Remote Browser Isolation (RBI)</a> deployments, providing:</p> <ul> <li><strong>Streamlined Onboarding:</strong> Easily set up and manage isolation policies from one location.</li> <li><strong>Quick Testing:</strong> Validate <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/">clientless web application isolation</a> with ease.</li> <li><strong>Simplified Configuration:</strong> Configure <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/isolate-application/">isolated access applications</a> and policies efficiently.</li> <li><strong>Centralized Monitoring:</strong> Track aggregate usage and blocked actions.</li> </ul> <p>This update consolidates previously disparate settings, accelerating deployment, improving visibility into isolation activity, and making it easier to ensure your protections are working effectively.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1717,height=1286,format=webp/_astro/browser-isolation-overview.Ljd5ax_O.png" alt="Browser Isolation Overview" loading="lazy" decoding="async" width="1717" height="1286"> <p>To access the new overview, log in to your Cloudflare <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a> and find Browser Isolation in the side navigation bar.</p>Thu, 01 May 2025 00:00:00 GMTBrowser IsolationBrowser IsolationR2 - R2 Dashboard experience gets new updateshttps://developers.cloudflare.com/changelog/post/2025-05-01-r2-dashboard-updates/https://developers.cloudflare.com/changelog/post/2025-05-01-r2-dashboard-updates/<p>We're excited to announce several improvements to the <a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a> dashboard experience that make managing your object storage easier and more intuitive:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2286,height=1600,format=webp/_astro/r2-dashboard-updates.B7WXxzMk.png" alt="Cloudflare R2 Dashboard" loading="lazy" decoding="async" width="2286" height="1600"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="all-new-settings-page">All-new settings page</h4><a class="anchor-link" href="#all-new-settings-page"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've redesigned the bucket settings page, giving you a centralized location to manage all your bucket configurations in one place.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="improved-navigation-and-sharing">Improved navigation and sharing</h4><a class="anchor-link" href="#improved-navigation-and-sharing"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Deeplink support for prefix directories: Navigate through your bucket hierarchy without losing your state. Your browser's back button now works as expected, and you can share direct links to specific prefix directories with teammates.</li> <li>Objects as clickable links: Objects are now proper links that you can copy or <code>CMD + Click</code> to open in a new tab.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="clearer-public-access-controls">Clearer public access controls</h4><a class="anchor-link" href="#clearer-public-access-controls"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Renamed "r2.dev domain" to "Public Development URL" for better clarity when exposing bucket contents for non-production workloads.</li> <li>Public Access status now clearly displays "Enabled" when your bucket is exposed to the internet (via Public Development URL or Custom Domains).</li> </ul> <p>We've also made numerous other usability improvements across the board to make your R2 experience smoother and more productive.</p>Thu, 01 May 2025 00:00:00 GMTR2R2Cloudflare One - Dark Mode for Zero Trust Dashboardhttps://developers.cloudflare.com/changelog/post/2025-04-30-zero-trust-dashboard-dark-mode/https://developers.cloudflare.com/changelog/post/2025-04-30-zero-trust-dashboard-dark-mode/ <p>The <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Zero Trust dashboard<span class="external-link"> ↗</span></a> now supports Cloudflare's native dark mode for all accounts and plan types.</p> <p>Zero Trust Dashboard will automatically accept your user-level preferences for system settings, so if your Dashboard appearance is set to 'system' or 'dark', the Zero Trust dashboard will enter dark mode whenever the rest of your Cloudflare account does.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3456,height=1596,format=webp/_astro/dark-mode.DfLeS20d.png" alt="Zero Trust dashboard supports dark mode" loading="lazy" decoding="async" width="3456" height="1596"><div data-nb-tabs class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="Zero Trust Dashboard" class><p>To update your view preference in the Zero Trust dashboard:</p><ol> <li>Log into the <a href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener">Zero Trust dashboard<span class="external-link"> ↗</span></a>.</li> <li>Select your user icon.</li> <li>Select <strong>Dark Mode</strong>.</li> </ol></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="Core Dashboard" class><p>To update your view preference in the Core dashboard:</p><ol> <li>Log into the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>.</li> <li>Go to <strong>My Profile</strong></li> <li>For <strong>Appearance</strong>, choose <strong>Dark</strong>.</li> </ol></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script>Wed, 30 Apr 2025 00:00:00 GMTCloudflare OneCloudflare OneCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Cloudflare One Appliance supports multiple DNS server IPshttps://developers.cloudflare.com/changelog/post/2025-04-30-appliance-multiple-dns-servers/https://developers.cloudflare.com/changelog/post/2025-04-30-appliance-multiple-dns-servers/<p>Cloudflare One Appliance DHCP server settings now support specifying multiple DNS server IP addresses in the DHCP pool.</p> <p>Previously, customers could only configure a single DNS server per DHCP pool. With this update, you can specify multiple DNS servers to provide redundancy for clients at branch locations.</p> <p>For configuration details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/dhcp/dhcp-server/">DHCP server</a>.</p>Wed, 30 Apr 2025 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANGateway - FQDN Filtering For Gateway Egress Policieshttps://developers.cloudflare.com/changelog/post/2025-04-28-FDQN-Filtering-Egress-Policies/https://developers.cloudflare.com/changelog/post/2025-04-28-FDQN-Filtering-Egress-Policies/<p>Cloudflare One administrators can now control which egress IP is used based on a destination's fully qualified domain name (FDQN) within Gateway Egress policies.</p> <ul> <li>Host, Domain, Content Categories, and Application selectors are now available in the Gateway Egress policy builder in beta.</li> <li>During the beta period, you can use these selectors with traffic on-ramped to Gateway with the WARP client, proxy endpoints (commonly deployed with PAC files), or Cloudflare Browser Isolation. <ul> <li>For WARP client support, additional configuration is required. For more information, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/#limitations">WARP client configuration documentation</a>.</li> </ul> </li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=841,height=1045,format=webp/_astro/Gateway-Egress-FQDN-Policy-preview.Civon5p8.png" alt="Egress by FQDN and Hostname" loading="lazy" decoding="async" width="841" height="1045"> <p>This will help apply egress IPs to your users' traffic when an upstream application or network requires it, while the rest of their traffic can take the most performant egress path.</p>Mon, 28 Apr 2025 00:00:00 GMTGatewayGatewayWAF - WAF Release - 2025-04-26 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-04-26-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-04-26-emergency-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="54ea354d7f2d43c69b238d1419fcc883"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...19fcc883</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100755</td><td><p>React.js - Router and Remix Vulnerability - CVE:CVE-2025-43864, CVE:CVE-2025-43865</p></td><td>Block</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Sat, 26 Apr 2025 00:00:00 GMTWAFWAFRules - Custom Errors are now Generally Availablehttps://developers.cloudflare.com/changelog/post/2025-04-24-custom-errors-ga/https://developers.cloudflare.com/changelog/post/2025-04-24-custom-errors-ga/<p><a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors</a> are now generally available for all paid plans — bringing a unified and powerful experience for customizing error responses at both the zone and account levels.</p> <p>You can now manage <strong>Custom Error Rules</strong>, <strong>Custom Error Assets</strong>, and redesigned <strong>Error Pages</strong> directly from the Cloudflare dashboard. These features let you deliver tailored messaging when errors occur, helping you maintain brand consistency and improve user experience — whether it’s a 404 from your origin or a security challenge from Cloudflare.</p> <p>What's new:</p> <ul> <li><strong>Custom Errors are now GA</strong> – Available on all paid plans and ready for production traffic.</li> <li><strong>UI for Custom Error Rules and Assets</strong> – Manage your zone-level rules from the Rules &gt; Overview and your zone-level assets from the Rules &gt; Settings tabs.</li> <li><strong>Define inline content or upload assets</strong> – Create custom responses directly in the rule builder, upload new or reuse previously stored assets.</li> <li><strong>Refreshed UI and new name for Error Pages</strong> – Formerly known as “Custom Pages,” Error Pages now offer a cleaner, more intuitive experience for both zone and account-level configurations.</li> <li><strong>Powered by Ruleset Engine</strong> – Custom Error Rules support <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/">conditional logic</a> and override Error Pages for 500 and 1000 class errors, as well as errors originating from your origin or <a href="https://developers.cloudflare.com/ruleset-engine/reference/phases-list/">other Cloudflare products</a>. You can also configure <a href="https://developers.cloudflare.com/rules/transform/response-header-modification/">Response Header Transform Rules</a> to add, change, or remove HTTP headers from responses returned by Custom Error Rules.</li> </ul> <p>Learn more in the <a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors documentation</a>.</p>Thu, 24 Apr 2025 00:00:00 GMTRulesRulesWorkers - Cron triggers are now supported in Python Workershttps://developers.cloudflare.com/changelog/post/2025-04-22-python-worker-cron-triggers/https://developers.cloudflare.com/changelog/post/2025-04-22-python-worker-cron-triggers/ <p>You can now create Python Workers which are executed via a cron trigger.</p> <p>This is similar to how it's done in JavaScript Workers, simply define a scheduled event listener in your Worker:</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> workers </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> handler</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">@handler</span></span> <span class="line"><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-1itgoe"> def</span><span class="nb-shiki-1t8gfj"> on_scheduled</span><span class="nb-shiki-140thh">(event, env, ctx):</span></span> <span class="line"><span class="nb-shiki-dzsirb"> print</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"cron processed"</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>Define a cron trigger configuration in your Wrangler configuration file:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "triggers"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Schedule cron triggers:</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // - At every 3rd minute</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // - At 15:00 (UTC) on first day of the month</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // - At 23:59 (UTC) on the last weekday of the month</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "crons"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "*/3 * * * *"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "0 15 1 * *"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "59 23 LW * *"</span></span> <span class="line"><span class="nb-shiki-140thh"> ]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">crons = [ </span><span class="nb-shiki-mdbnqw">"*/3 * * * *"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"0 15 1 * *"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"59 23 LW * *"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Then test your new handler by using Wrangler with the <code>--test-scheduled</code> flag and making a request to <code>/cdn-cgi/handler/scheduled?cron=*+*+*+*+*</code>:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> dev</span><span class="nb-shiki-dzsirb"> --test-scheduled</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "http://localhost:8787/cdn-cgi/handler/scheduled?cron=*+*+*+*+*"</span></span></code></pre></figure> <p>Consult the <a href="https://developers.cloudflare.com/workers/configuration/cron-triggers/">Workers Cron Triggers page</a> for full details on cron triggers in Workers.</p>Thu, 24 Apr 2025 00:00:00 GMTWorkersWorkersAI Search - Metadata filtering and multitenancy support in AutoRAGhttps://developers.cloudflare.com/changelog/post/2025-04-23-autorag-metadata-filtering/https://developers.cloudflare.com/changelog/post/2025-04-23-autorag-metadata-filtering/<p>You can now filter <a href="https://developers.cloudflare.com/ai-search/">AutoRAG</a> search results by <code>folder</code> and <code>timestamp</code> using <a href="https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/">metadata filtering</a> to narrow down the scope of your query.</p> <p>This makes it easy to build <a href="https://developers.cloudflare.com/ai-search/how-to/per-tenant-search/">multitenant experiences</a> where each user can only access their own data. By organizing your content into per-tenant folders and applying a <code>folder</code> filter at query time, you ensure that each tenant retrieves only their own documents.</p> <p><strong>Example folder structure:</strong></p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">customer-a/logs/</span></span> <span class="line"><span class="nb-shiki-1t8gfj">customer-a/contracts/</span></span> <span class="line"><span class="nb-shiki-1t8gfj">customer-b/contracts/</span></span></code></pre></figure> <p><strong>Example query:</strong></p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">autorag</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"my-autorag"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> query: </span><span class="nb-shiki-mdbnqw">"When did I sign my agreement contract?"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> filters: {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"eq"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> key: </span><span class="nb-shiki-mdbnqw">"folder"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> value: </span><span class="nb-shiki-mdbnqw">"customer-a/contracts/"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>You can use metadata filtering by creating a new AutoRAG or reindexing existing data. To reindex all content in an existing AutoRAG, update any chunking setting and select <strong>Sync index</strong>. Metadata filtering is available for all data indexed on or after <strong>April 21, 2025</strong>.</p> <p>If you are new to AutoRAG, get started with the <a href="https://developers.cloudflare.com/ai-search/get-started/">Get started AutoRAG guide</a>.</p>Wed, 23 Apr 2025 00:00:00 GMTAI SearchAI SearchWAF - WAF Release - 2025-04-22https://developers.cloudflare.com/changelog/post/2025-04-22-waf-release/https://developers.cloudflare.com/changelog/post/2025-04-22-waf-release/ <p>Each of this week's rule releases covers a distinct CVE, with half of the rules targeting Remote Code Execution (RCE) attacks. Of the 6 CVEs covered, four were scored as critical, with the other two scored as high.</p> <p>When deciding which exploits to tackle, Cloudflare tunes into the attackers' areas of focus. Cloudflare's network intelligence provides a unique lens into attacker activity – for instance, through the volume of blocked requests related with CVE exploits after updating WAF Managed Rules with new detections.</p> <p>From this week's releases, one indicator that RCE is a "hot topic" attack type is the fact that the Oracle PeopleSoft RCE rule accounts for half of all of the new rule matches. This rule patches CVE-2023-22047, a high-severity vulnerability in the Oracle PeopleSoft suite that allows unauthenticated attackers to access PeopleSoft Enterprise PeopleTools data through remote code execution. This is particularly concerning because of the nature of the data managed by PeopleSoft – this can include payroll records or student profile information. This CVE, along with five others, are addressed with the latest detection update to WAF Managed Rules.</p> <table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="faa032d9825e4844a1188f3ba5be3327"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a5be3327</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100738</td><td>GitLab - Auth Bypass - CVE:CVE-2023-7028</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2e96b6d5cdd94f7782b90e266c9531fa"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...6c9531fa</span></button></rule-id></td><td>100740</td><td>Splunk Enterprise - Remote Code Execution - CVE:CVE-2025-20229</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5c9c095bc1e5411195edb893f40bbc2b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f40bbc2b</span></button></rule-id></td><td>100741</td><td>Oracle PeopleSoft - Remote Code Execution - CVE:CVE-2023-22047</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1d7a3932296c42fd827055335462167c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5462167c</span></button></rule-id></td><td>100742</td><td>CrushFTP - Auth Bypass - CVE:CVE-2025-31161</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5eb7ed601e6844828b9bdb05caa7b208"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...caa7b208</span></button></rule-id></td><td>100743</td><td>Ivanti - Buffer Error - CVE:CVE-2025-22457</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="410317f1e32b41859fa3214dd52139a8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d52139a8</span></button></rule-id></td><td>100744</td><td><p>Oracle Access Manager - Remote Code Execution - CVE:CVE-2021-35587</p></td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Tue, 22 Apr 2025 00:00:00 GMTWAFWAFAccess - Access bulk policy testerhttps://developers.cloudflare.com/changelog/post/2025-04-21-Access-Bulk-Policy-Tester/https://developers.cloudflare.com/changelog/post/2025-04-21-Access-Bulk-Policy-Tester/<p>The <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/policy-management/#test-all-policies-in-an-application">Access bulk policy tester</a> is now available in the Cloudflare Zero Trust dashboard. The bulk policy tester allows you to simulate Access policies against your entire user base before and after deploying any changes. The policy tester will simulate the configured policy against each user's last seen identity and device posture (if applicable).</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1531,height=693,format=webp/_astro/example-policy-tester.DCY8hQvx.png" alt="Example policy tester" loading="lazy" decoding="async" width="1531" height="693">Mon, 21 Apr 2025 00:00:00 GMTAccessAccessLogs - Custom fields raw and transformed values supporthttps://developers.cloudflare.com/changelog/post/2025-04-18-custom-fields-raw-transformed-values/https://developers.cloudflare.com/changelog/post/2025-04-18-custom-fields-raw-transformed-values/<p>Custom Fields now support logging both <strong>raw and transformed values</strong> for request and response headers in the HTTP requests dataset.</p> <p>These fields are configured per zone and apply to all Logpush jobs in that zone that include request headers, response headers. Each header can be logged in only one format—either raw or transformed—not both.</p> <p>By default:</p> <ul> <li>Request headers are logged as raw values</li> <li>Response headers are logged as transformed values</li> </ul> <p>These defaults can be overridden to suit your logging needs.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Transformed and raw values for request and response headers are available <strong>only via the API</strong> and cannot be set through the UI.</p></div></div></aside> <p>For more information refer to <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/custom-fields/">Custom fields</a> documentation</p>Fri, 18 Apr 2025 00:00:00 GMTLogsLogsQueues - Increased limits for Queues pull consumershttps://developers.cloudflare.com/changelog/post/2025-04-17-pull-consumer-limits/https://developers.cloudflare.com/changelog/post/2025-04-17-pull-consumer-limits/<p><a href="https://developers.cloudflare.com/queues/configuration/pull-consumers/">Queues pull consumers</a> can now pull and acknowledge up to <strong>5,000 messages / second per queue</strong>. Previously, pull consumers were rate limited to 1,200 requests / 5 minutes, aggregated across all queues.</p> <p>Pull consumers allow you to consume messages over HTTP from any environment—including outside of <a href="https://developers.cloudflare.com/workers">Cloudflare Workers</a>. They’re also useful when you need fine-grained control over how quickly messages are consumed.</p> <p>To setup a new queue with a pull based consumer using <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, run:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="sh"><figcaption class="nb-code-title"><span class="nb-code-title-name">Create a queue with a pull based consumer</span><span class="nb-code-title-lang">sh</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-queue</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> consumer</span><span class="nb-shiki-mdbnqw"> http</span><span class="nb-shiki-mdbnqw"> add</span><span class="nb-shiki-mdbnqw"> my-queue</span></span></code></pre></figure> <p>You can also configure a pull consumer using the <a href="https://developers.cloudflare.com/api/resources/queues/subresources/consumers/methods/create/">REST API</a> or the Queues dashboard.</p> <p>Once configured, you can pull messages from the queue using any HTTP client. You'll need a <a href="https://developers.cloudflare.com/fundamentals/api/get-started/create-token/">Cloudflare API Token</a> with <code>queues_read</code> and <code>queues_write</code> permissions. For example:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Pull messages from a queue</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/accounts/${</span><span class="nb-shiki-140thh">CF_ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">}/queues/${</span><span class="nb-shiki-140thh">QUEUE_ID</span><span class="nb-shiki-mdbnqw">}/messages/pull"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer ${</span><span class="nb-shiki-140thh">API_TOKEN</span><span class="nb-shiki-mdbnqw">}"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'{ "visibility_timeout": 10000, "batch_size": 2 }'</span></span></code></pre></figure> <p>To learn more about how to acknowledge messages, pull batches at once, and setup multiple consumers, refer to the <a href="https://developers.cloudflare.com/queues/configuration/pull-consumers">pull consumer documentation</a>.</p> <p>As always, Queues doesn't charge for data egress. Pull operations continue to be billed at the <a href="https://developers.cloudflare.com/queues/platform/pricing">existing rate</a>, of $0.40 / million operations. The increased limits are available now, on all new and existing queues. If you're new to Queues, <a href="https://developers.cloudflare.com/queues/get-started">get started with the Cloudflare Queues guide</a>.</p>Thu, 17 Apr 2025 12:00:00 GMTQueuesQueuesKV - Read multiple keys from Workers KV with bulk readshttps://developers.cloudflare.com/changelog/post/2025-04-10-kv-bulk-reads/https://developers.cloudflare.com/changelog/post/2025-04-10-kv-bulk-reads/<p>You can now retrieve up to 100 keys in a single bulk read request made to Workers KV using the binding.</p> <p>This makes it easier to request multiple KV pairs within a single Worker invocation. Retrieving many key-value pairs using the bulk read operation is more performant than making individual requests since bulk read operations are not affected by <a href="https://developers.cloudflare.com/workers/platform/limits/#simultaneous-open-connections">Workers simultaneous connection limits</a>.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// Read single key</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> key</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "key-a"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> value</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">NAMESPACE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(key);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Read multiple keys</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> keys</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-mdbnqw">"key-a"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"key-b"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"key-c"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">...</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-21nrsd">// up to 100 keys</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> values</span><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-1t8gfj"> Map</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-dzsirb">string</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">string</span><span class="nb-shiki-1itgoe">?</span><span class="nb-shiki-140thh">&gt; </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">NAMESPACE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(keys);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Print the value of "key-a" to the console.</span></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`The first key is ${</span><span class="nb-shiki-140thh">values</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-mdbnqw">(</span><span class="nb-shiki-mdbnqw">"key-a"</span><span class="nb-shiki-mdbnqw">)</span><span class="nb-shiki-mdbnqw">}.`</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>Consult the <a href="https://developers.cloudflare.com/kv/api/read-key-value-pairs/">Workers KV Read key-value pairs API</a> for full details on Workers KV's new bulk reads support.</p>Thu, 17 Apr 2025 00:00:00 GMTKVKVRegistrar - Cloudflare Registrar API is now in betahttps://developers.cloudflare.com/changelog/post/2026-04-15-registrar-api-beta/https://developers.cloudflare.com/changelog/post/2026-04-15-registrar-api-beta/<p>Cloudflare Registrar API is now in beta.</p> <p>You can now use the Cloudflare API to:</p> <ul> <li>Search for domain names.</li> <li>Check real-time availability and pricing.</li> <li>Register supported domains programmatically.</li> </ul> <p>This beta supports a subset of popular extensions available through Cloudflare Registrar. Search returns suggestions across API-supported extensions, check confirms current availability and pricing, and registration starts a workflow that can complete immediately or be polled if it takes longer.</p> <p>Because the Registrar API is part of the Cloudflare API, it can also be used in <a href="https://github.com/cloudflare/mcp" target="_blank" rel="noopener">Cloudflare MCP<span class="external-link"> ↗</span></a> and other agent-driven workflows.</p> <p>If you are using Cloudflare MCP or other agent-driven workflows, prompts can be as simple as:</p> <ul> <li><code>Search for domain ideas for a coffee shop based in Evergreen, Colorado.</code></li> <li><code>Check whether example.com is available and show me the current price.</code></li> <li><code>Register example.com</code></li> </ul> <p>For supported operations, extension availability, and workflow details, refer to:</p> <ul> <li><a href="https://developers.cloudflare.com/registrar/registrar-api/" target="_blank" rel="noopener">Registrar API guide<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/api/resources/registrar" target="_blank" rel="noopener">Registrar API reference<span class="external-link"> ↗</span></a></li> </ul>Tue, 15 Apr 2025 00:00:00 GMTRegistrarRegistrarWorkers, Workers for Platforms - Fixed and documented Workers Routes and Secrets APIhttps://developers.cloudflare.com/changelog/post/2025-04-15-workers-api-fixes/https://developers.cloudflare.com/changelog/post/2025-04-15-workers-api-fixes/<div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-routes-api">Workers Routes API</h4><a class="anchor-link" href="#workers-routes-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Previously, a request to the Workers <a href="https://developers.cloudflare.com/api/resources/workers/subresources/routes/methods/create/">Create Route API</a> always returned <code>null</code> for "script" and an empty string for "pattern" even if the request was successful.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example request</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://api.cloudflare.com/client/v4/zones/</span><span class="nb-shiki-140thh">$CF_ACCOUNT_ID</span><span class="nb-shiki-mdbnqw">/workers/routes</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">-X </span><span class="nb-shiki-mdbnqw">PUT</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">-H </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer </span><span class="nb-shiki-140thh">$CF_API_TOKEN</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">-H </span><span class="nb-shiki-mdbnqw">'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'{ "pattern": "example.com/*", "script": "hello-world-script" }'</span></span></code></pre></figure> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example bad response</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "result"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"bf153a27ba2b464bb9f04dcf75de1ef9"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pattern"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">""</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "script"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "request_limit_fail_open"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "success"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "errors"</span><span class="nb-shiki-140thh">: [],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "messages"</span><span class="nb-shiki-140thh">: []</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Now, it properly returns all values!</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example good response</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "result"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"bf153a27ba2b464bb9f04dcf75de1ef9"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "pattern"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"example.com/*"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "script"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"hello-world-script"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "request_limit_fail_open"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "success"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "errors"</span><span class="nb-shiki-140thh">: [],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "messages"</span><span class="nb-shiki-140thh">: []</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-secrets-api">Workers Secrets API</h4><a class="anchor-link" href="#workers-secrets-api"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/secrets/">Workers</a> and <a href="https://developers.cloudflare.com/api/resources/workers_for_platforms/subresources/dispatch/subresources/namespaces/subresources/scripts/subresources/secrets/">Workers for Platforms</a> secrets APIs are now properly documented in the Cloudflare OpenAPI docs. Previously, these endpoints were not publicly documented, leaving users confused on how to directly manage their secrets via the API. Now, you can find the proper endpoints in our public documentation, as well as in our API Library SDKs such as <a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener">cloudflare-typescript<span class="external-link"> ↗</span></a> (&gt;4.2.0) and <a href="https://github.com/cloudflare/cloudflare-python" target="_blank" rel="noopener">cloudflare-python<span class="external-link"> ↗</span></a> (&gt;4.1.0).</p> <p>Note the <code>cloudflare_workers_secret</code> and <code>cloudflare_workers_for_platforms_script_secret</code> <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform resources<span class="external-link"> ↗</span></a> are being removed in a future release. This resource is not recommended for managing secrets. Users should instead use the:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/secrets_store/">Secrets Store</a> with the "Secrets Store Secret" binding on Workers and Workers for Platforms Script Upload</li> <li>"Secret Text" Binding on <a href="https://developers.cloudflare.com/api/resources/workers/subresources/scripts/methods/update/">Workers Script Upload</a> and <a href="https://developers.cloudflare.com/api/resources/workers_for_platforms/subresources/dispatch/subresources/namespaces/subresources/scripts/methods/update/">Workers for Platforms Script Upload</a></li> <li>Workers (and WFP) Secrets API</li> </ul>Tue, 15 Apr 2025 00:00:00 GMTWorkersWorkersWorkers for PlatformsData Loss Prevention - New predefined detection entry for ICD-11https://developers.cloudflare.com/changelog/post/2025-04-14-icd11-support/https://developers.cloudflare.com/changelog/post/2025-04-14-icd11-support/<p>You now have access to the World Health Organization (WHO) 2025 edition of the <a href="https://www.who.int/news/item/14-02-2025-who-releases-2025-update-to-the-international-classification-of-diseases-%28icd-11%29" target="_blank" rel="noopener">International Classification of Diseases 11th Revision (ICD-11)<span class="external-link"> ↗</span></a> as a predefined detection entry. The new dataset can be found in the <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#health-information">Health Information</a> predefined profile.</p> <p>ICD-10 dataset remains available for use.</p>Mon, 14 Apr 2025 00:00:00 GMTData Loss PreventionData Loss PreventionWAF - WAF Release - 2025-04-14https://developers.cloudflare.com/changelog/post/2025-04-14-waf-release/https://developers.cloudflare.com/changelog/post/2025-04-14-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="9209bb65527f4c088bca5ffad6b2d36c"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d6b2d36c</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100739A</td><td>Next.js - Auth Bypass - CVE:CVE-2025-29927 - 2</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Mon, 14 Apr 2025 00:00:00 GMTWAFWAFGateway - HTTP redirect and custom block page redirecthttps://developers.cloudflare.com/changelog/post/2025-04-11-http-redirect-custom-block-page-redirect/https://developers.cloudflare.com/changelog/post/2025-04-11-http-redirect-custom-block-page-redirect/<p>You can now use more flexible redirect capabilities in Cloudflare One with Gateway.</p> <ul> <li>A new <strong>Redirect</strong> action is available in the HTTP policy builder, allowing admins to redirect users to any URL when their request matches a policy. You can choose to preserve the original URL and query string, and optionally include policy context via query parameters.</li> <li>For <strong>Block</strong> actions, admins can now configure a custom URL to display when access is denied. This block page redirect is set at the account level and can be overridden in DNS or HTTP policies. Policy context can also be passed along in the URL.</li> </ul> <p>Learn more in our documentation for <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#redirect">HTTP Redirect</a> and <a href="https://developers.cloudflare.com/cloudflare-one/reusable-components/custom-pages/gateway-block-page/#redirect-to-a-block-page">Block page redirect</a>.</p>Fri, 11 Apr 2025 00:00:00 GMTGatewayGatewayStream - Signed URLs and Infrastructure Improvements on Stream Live WebRTC Betahttps://developers.cloudflare.com/changelog/post/2025-04-14-webrtc-beta-signed-urls/https://developers.cloudflare.com/changelog/post/2025-04-14-webrtc-beta-signed-urls/<p>Cloudflare <a href="https://developers.cloudflare.com/stream/">Stream</a> has completed an infrastructure upgrade for our <a href="https://developers.cloudflare.com/stream/webrtc-beta/">Live WebRTC beta</a> support which brings increased scalability and improved playback performance to all customers. WebRTC allows broadcasting directly from a browser (or supported WHIP client) with ultra-low latency to tens of thousands of concurrent viewers across the globe.</p> <p>Additionally, as part of this upgrade, the WebRTC beta now supports Signed URLs to protect playback, just like our standard live stream options (HLS/DASH).</p> <p>For more information, learn about the <a href="https://developers.cloudflare.com/stream/webrtc-beta/">Stream Live WebRTC beta</a>.</p>Fri, 11 Apr 2025 00:00:00 GMTStreamStreamWorkers AI - Workers AI for Developer Week - faster inference, new models, async batch API, expanded LoRA supporthttps://developers.cloudflare.com/changelog/post/2025-04-11-new-models-faster-inference/https://developers.cloudflare.com/changelog/post/2025-04-11-new-models-faster-inference/<p>Happy Developer Week 2025! Workers AI is excited to announce a couple of new features and improvements available today. Check out our <a href="https://blog.cloudflare.com/workers-ai-improvements" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> for all the announcement details.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="faster-inference--new-models">Faster inference + New models</h4><a class="anchor-link" href="#faster-inference--new-models"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We’re rolling out some in-place improvements to our models that can help speed up inference by 2-4x! Users of the models below will enjoy an automatic speed boost starting today:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/"><code>@cf/meta/llama-3.3-70b-instruct-fp8-fast</code></a> gets a speed boost of 2-4x, leveraging techniques like speculative decoding, prefix caching, and an updated inference backend.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-small-en-v1.5/"><code>@cf/baai/bge-small-en-v1.5</code></a>, <a href="https://developers.cloudflare.com/workers-ai/models/bge-base-en-v1.5/"><code>@cf/baai/bge-base-en-v1.5</code></a>, <a href="https://developers.cloudflare.com/workers-ai/models/bge-large-en-v1.5/"><code>@cf/baai/bge-large-en-v1.5</code></a> get an updated back end, which should improve inference times by 2x. <ul> <li>With the <code>bge</code> models, we’re also announcing a new parameter called <code>pooling</code> which can take <code>cls</code> or <code>mean</code> as options. We highly recommend using <code>pooling: cls</code> which will help generate more accurate embeddings. However, embeddings generated with cls pooling are not backwards compatible with mean pooling. For this to not be a breaking change, the default remains as mean pooling. Please specify <code>pooling: cls</code> to enjoy more accurate embeddings going forward.</li> </ul> </li> </ul> <p>We’re also excited to launch a few new models in our catalog to help round out your experience with Workers AI. We’ll be deprecating some older models in the future, so stay tuned for a deprecation announcement. Today’s new models include:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/mistral-small-3.1-24b-instruct/"><code>@cf/mistralai/mistral-small-3.1-24b-instruct</code></a>: a 24B parameter model achieving state-of-the-art capabilities comparable to larger models, with support for vision and tool calling.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/gemma-3-12b-it/"><code>@cf/google/gemma-3-12b-it</code></a>: well-suited for a variety of text generation and image understanding tasks, including question answering, summarization and reasoning, with a 128K context window, and multilingual support in over 140 languages.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/qwq-32b/"><code>@cf/qwen/qwq-32b</code></a>: a medium-sized reasoning model, which is capable of achieving competitive performance against state-of-the-art reasoning models, e.g., DeepSeek-R1, o1-mini.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/qwen2.5-coder-32b-instruct/"><code>@cf/qwen/qwen2.5-coder-32b-instruct</code></a>: the current state-of-the-art open-source code LLM, with its coding abilities matching those of GPT-4o.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="batch-inference">Batch Inference</h4><a class="anchor-link" href="#batch-inference"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Introducing a new batch inference feature that allows you to send us an array of requests, which we will fulfill as fast as possible and send them back as an array. This is really helpful for large workloads such as summarization, embeddings, etc. where you don’t have a human-in-the-loop. Using the batch API will guarantee that your requests are fulfilled eventually, rather than erroring out if we don’t have enough capacity at a given time.</p> <p>Check out the <a href="https://developers.cloudflare.com/workers-ai/features/batch-api/">tutorial</a> to get started! Models that support batch inference today include:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/"><code>@cf/meta/llama-3.3-70b-instruct-fp8-fast</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-small-en-v1.5/"><code>@cf/baai/bge-small-en-v1.5</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-base-en-v1.5/"><code>@cf/baai/bge-base-en-v1.5</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-large-en-v1.5/"><code>@cf/baai/bge-large-en-v1.5</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-m3/"><code>@cf/baai/bge-m3</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/m2m100-1.2b/"><code>@cf/meta/m2m100-1.2b</code></a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="expanded-lora-support">Expanded LoRA support</h4><a class="anchor-link" href="#expanded-lora-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We’ve upgraded our LoRA experience to include 8 newer models, and can support ranks of up to 32 with a 300MB safetensors file limit (previously limited to rank of 8 and 100MB safetensors) Check out our <a href="https://developers.cloudflare.com/workers-ai/features/fine-tunes/loras/">LoRAs page</a> to get started. Models that support LoRAs now include:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-3.2-11b-vision-instruct/"><code>@cf/meta/llama-3.2-11b-vision-instruct</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/"><code>@cf/meta/llama-3.3-70b-instruct-fp8-fast</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-guard-3-8b/"><code>@cf/meta/llama-guard-3-8b</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/llama-3.1-8b-instruct-fast/"><code>@cf/meta/llama-3.1-8b-instruct-fast</code></a> (coming soon)</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/deepseek-r1-distill-qwen-32b/"><code>@cf/deepseek-ai/deepseek-r1-distill-qwen-32b</code></a> (coming soon)</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/qwen2.5-coder-32b-instruct/"><code>@cf/qwen/qwen2.5-coder-32b-instruct</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/qwq-32b/"><code>@cf/qwen/qwq-32b</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/mistral-small-3.1-24b-instruct/"><code>@cf/mistralai/mistral-small-3.1-24b-instruct</code></a></li> <li><a href="https://developers.cloudflare.com/workers-ai/models/gemma-3-12b-it/"><code>@cf/google/gemma-3-12b-it</code></a></li> </ul>Fri, 11 Apr 2025 00:00:00 GMTWorkers AIWorkers AID1, Workers - D1 Read Replication Public Betahttps://developers.cloudflare.com/changelog/post/2025-04-10-d1-read-replication-beta/https://developers.cloudflare.com/changelog/post/2025-04-10-d1-read-replication-beta/<p>D1 read replication is available in public beta to help lower average latency and increase overall throughput for read-heavy applications like e-commerce websites or content management tools.</p> <p>Workers can leverage read-only database copies, called read replicas, by using D1 <a href="https://developers.cloudflare.com/d1/best-practices/read-replication">Sessions API</a>. A session encapsulates all the queries from one logical session for your application. For example, a session may correspond to all queries coming from a particular web browser session. With Sessions API, D1 queries in a session are guaranteed to be <a href="https://developers.cloudflare.com/d1/best-practices/read-replication/#replica-lag-and-consistency-model">sequentially consistent</a> to avoid data consistency pitfalls. D1 <a href="https://developers.cloudflare.com/d1/reference/time-travel/#bookmarks">bookmarks</a> can be used from a previous session to ensure logical consistency between sessions.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// retrieve bookmark from previous session stored in HTTP header</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> bookmark</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> request.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"x-d1-bookmark"</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> "first-unconstrained"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> session</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">DB</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">withSession</span><span class="nb-shiki-140thh">(bookmark);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> session</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">prepare</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`SELECT * FROM Customers WHERE CompanyName = 'Bs Beverages'`</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-21nrsd">// store bookmark for a future session</span></span> <span class="line"><span class="nb-shiki-140thh">response.headers.</span><span class="nb-shiki-1t8gfj">set</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"x-d1-bookmark"</span><span class="nb-shiki-140thh">, session.</span><span class="nb-shiki-1t8gfj">getBookmark</span><span class="nb-shiki-140thh">() </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> ""</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Read replicas are automatically created by Cloudflare (currently one in each supported <a href="https://developers.cloudflare.com/d1/best-practices/read-replication/#read-replica-locations">D1 region</a>), are active/inactive based on query traffic, and are transparently routed to by Cloudflare at no additional cost.</p> <p>To checkout D1 read replication, deploy the following Worker code using Sessions API, which will prompt you to create a D1 database and enable read replication on said database.</p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/d1-starter-sessions-api" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare"></a></p> <p>To learn more about how read replication was implemented, go to our <a href="https://blog.cloudflare.com/d1-read-replication-beta" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Thu, 10 Apr 2025 00:00:00 GMTD1D1WorkersPipelines, R2, Workers - Cloudflare Pipelines now available in betahttps://developers.cloudflare.com/changelog/post/2025-04-10-launching-pipelines/https://developers.cloudflare.com/changelog/post/2025-04-10-launching-pipelines/<p><a href="https://developers.cloudflare.com/pipelines">Cloudflare Pipelines</a> is now available in beta, to all users with a <a href="https://developers.cloudflare.com/workers/platform/pricing">Workers Paid</a> plan.</p> <p>Pipelines let you ingest high volumes of real time data, without managing the underlying infrastructure. A single pipeline can ingest up to 100 MB of data per second, via HTTP or from a <a href="https://developers.cloudflare.com/workers">Worker</a>. Ingested data is automatically batched, written to output files, and delivered to an <a href="https://developers.cloudflare.com/r2">R2 bucket</a> in your account. You can use Pipelines to build a data lake of clickstream data, or to store events from a Worker.</p> <p>Create your first pipeline with a single command:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Create a pipeline</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> npx</span><span class="nb-shiki-mdbnqw"> wrangler@latest</span><span class="nb-shiki-mdbnqw"> pipelines</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> my-clickstream-pipeline</span><span class="nb-shiki-dzsirb"> --r2-bucket</span><span class="nb-shiki-mdbnqw"> my-bucket</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">🌀</span><span class="nb-shiki-mdbnqw"> Authorizing</span><span class="nb-shiki-mdbnqw"> R2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> "my-bucket"</span></span> <span class="line"><span class="nb-shiki-1t8gfj">🌀</span><span class="nb-shiki-mdbnqw"> Creating</span><span class="nb-shiki-mdbnqw"> pipeline</span><span class="nb-shiki-mdbnqw"> named</span><span class="nb-shiki-mdbnqw"> "my-clickstream-pipeline"</span></span> <span class="line"><span class="nb-shiki-1t8gfj">✅</span><span class="nb-shiki-mdbnqw"> Successfully</span><span class="nb-shiki-mdbnqw"> created</span><span class="nb-shiki-mdbnqw"> pipeline</span><span class="nb-shiki-mdbnqw"> my-clickstream-pipeline</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">Id:</span><span class="nb-shiki-mdbnqw"> 0e00c5ff09b34d018152af98d06f5a1xvc</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Name:</span><span class="nb-shiki-mdbnqw"> my-clickstream-pipeline</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Sources:</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> HTTP:</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Endpoint:</span><span class="nb-shiki-mdbnqw"> https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Authentication:</span><span class="nb-shiki-mdbnqw"> off</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Format:</span><span class="nb-shiki-mdbnqw"> JSON</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Worker:</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Format:</span><span class="nb-shiki-mdbnqw"> JSON</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Destination:</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Type:</span><span class="nb-shiki-mdbnqw"> R2</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Bucket:</span><span class="nb-shiki-mdbnqw"> my-bucket</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Format:</span><span class="nb-shiki-mdbnqw"> newline-delimited</span><span class="nb-shiki-mdbnqw"> JSON</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Compression:</span><span class="nb-shiki-mdbnqw"> GZIP</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Batch</span><span class="nb-shiki-mdbnqw"> hints:</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Max</span><span class="nb-shiki-mdbnqw"> bytes:</span><span class="nb-shiki-dzsirb"> 100</span><span class="nb-shiki-mdbnqw"> MB</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Max</span><span class="nb-shiki-mdbnqw"> duration:</span><span class="nb-shiki-dzsirb"> 300</span><span class="nb-shiki-mdbnqw"> seconds</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> Max</span><span class="nb-shiki-mdbnqw"> records:</span><span class="nb-shiki-mdbnqw"> 100,000</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">🎉</span><span class="nb-shiki-mdbnqw"> You</span><span class="nb-shiki-mdbnqw"> can</span><span class="nb-shiki-mdbnqw"> now</span><span class="nb-shiki-mdbnqw"> send</span><span class="nb-shiki-mdbnqw"> data</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> pipeline!</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">Send</span><span class="nb-shiki-mdbnqw"> data</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> your</span><span class="nb-shiki-mdbnqw"> pipeline's HTTP endpoint:</span></span> <span class="line"><span class="nb-shiki-mdbnqw">curl "https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/" -d '[{</span><span class="nb-shiki-mdbnqw"> ...JSON_DATA...</span><span class="nb-shiki-mdbnqw"> }]'</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-mdbnqw">To send data to your pipeline from a Worker, add the following configuration to your config file:</span></span> <span class="line"><span class="nb-shiki-mdbnqw">{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "pipelines": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "pipeline": "my-clickstream-pipeline",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "binding": "PIPELINE"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}</span></span></code></pre></figure> <p>Head over to our <a href="https://developers.cloudflare.com/pipelines/getting-started">getting started guide</a> for an in-depth tutorial to building with Pipelines.</p>Thu, 10 Apr 2025 00:00:00 GMTPipelinesPipelinesR2WorkersR2, R2 Data Catalog - R2 Data Catalog is a managed Apache Iceberg data catalog built directly into R2 bucketshttps://developers.cloudflare.com/changelog/post/2025-04-10-r2-data-catalog-beta/https://developers.cloudflare.com/changelog/post/2025-04-10-r2-data-catalog-beta/<p>Today, we are launching <a href="https://developers.cloudflare.com/r2-data-catalog/">R2 Data Catalog</a> in open beta, a managed Apache Iceberg catalog built directly into your <a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a> bucket.</p> <p>If you are not already familiar with it, <a href="https://iceberg.apache.org/" target="_blank" rel="noopener">Apache Iceberg<span class="external-link"> ↗</span></a> is an open table format designed to handle large-scale analytics datasets stored in object storage, offering ACID transactions and schema evolution. R2 Data Catalog exposes a standard Iceberg REST catalog interface, so you can connect engines like <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/spark-scala/">Spark</a>, <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/snowflake/">Snowflake</a>, and <a href="https://developers.cloudflare.com/r2-data-catalog/config-examples/pyiceberg/">PyIceberg</a> to start querying your tables using the tools you already know.</p> <p>To enable a data catalog on your R2 bucket, find <strong>R2 Data Catalog</strong> in your buckets settings in the dashboard, or run:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> catalog</span><span class="nb-shiki-mdbnqw"> enable</span><span class="nb-shiki-mdbnqw"> my-bucket</span></span></code></pre></figure> <p>And that's it. You'll get a catalog URI and warehouse you can plug into your favorite Iceberg engines.</p> <p>Visit our <a href="https://developers.cloudflare.com/r2-data-catalog/get-started/">getting started guide</a> for step-by-step instructions on enabling R2 Data Catalog, creating tables, and running your first queries.</p>Thu, 10 Apr 2025 00:00:00 GMTR2R2R2 Data CatalogAccess - Cloudflare Zero Trust SCIM User and Group Provisioning Logshttps://developers.cloudflare.com/changelog/post/2025-04-09-SCIM-provisioning-logs/https://developers.cloudflare.com/changelog/post/2025-04-09-SCIM-provisioning-logs/<p><a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/scim">Cloudflare Zero Trust SCIM provisioning</a> now has a full audit log of all create, update and delete event from any SCIM Enabled IdP. The <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/scim-logs/">SCIM logs</a> support filtering by IdP, Event type, Result and many more fields. This will help with debugging user and group update issues and questions.</p> <p>SCIM logs can be found on the Zero Trust Dashboard under <strong>Logs</strong> -&gt; <strong>SCIM provisioning</strong>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2318,height=1060,format=webp/_astro/example-scim-log.Bv5Zqckh.png" alt="Example SCIM Logs" loading="lazy" decoding="async" width="2318" height="1060">Wed, 09 Apr 2025 00:00:00 GMTAccessAccessHyperdrive - Hyperdrive now supports custom TLS/SSL certificateshttps://developers.cloudflare.com/changelog/post/2025-04-09-hyperdrive-custom-certificate-support/https://developers.cloudflare.com/changelog/post/2025-04-09-hyperdrive-custom-certificate-support/ <p>Hyperdrive now supports more SSL/TLS security options for your database connections:</p> <ul> <li>Configure Hyperdrive to verify server certificates with <code>verify-ca</code> or <code>verify-full</code> SSL modes and protect against man-in-the-middle attacks</li> <li>Configure Hyperdrive to provide client certificates to the database server to authenticate itself (mTLS) for stronger security beyond username and password</li> </ul> <p>Use the new <code>wrangler cert</code> commands to create certificate authority (CA) certificate bundles or client certificate pairs:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-21nrsd"># Create CA certificate bundle</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> cert</span><span class="nb-shiki-mdbnqw"> upload</span><span class="nb-shiki-mdbnqw"> certificate-authority</span><span class="nb-shiki-dzsirb"> --ca-cert</span><span class="nb-shiki-mdbnqw"> your-ca-cert.pem</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> your-custom-ca-name</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Create client certificate pair</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> cert</span><span class="nb-shiki-mdbnqw"> upload</span><span class="nb-shiki-mdbnqw"> mtls-certificate</span><span class="nb-shiki-dzsirb"> --cert</span><span class="nb-shiki-mdbnqw"> client-cert.pem</span><span class="nb-shiki-dzsirb"> --key</span><span class="nb-shiki-mdbnqw"> client-key.pem</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> your-client-cert-name</span></span></code></pre></figure> <p>Then create a Hyperdrive configuration with the certificates and desired SSL mode:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> hyperdrive</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> your-hyperdrive-config</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --connection-string=</span><span class="nb-shiki-mdbnqw">"postgres://user:password@hostname:port/database"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --ca-certificate-id</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">CA_CERT_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --mtls-certificate-id</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">CLIENT_CERT_I</span><span class="nb-shiki-140thh">D</span><span class="nb-shiki-1itgoe">&gt;</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> --sslmode</span><span class="nb-shiki-mdbnqw"> verify-full</span></span></code></pre></figure> <p>Learn more about <a href="https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/">configuring SSL/TLS certificates for Hyperdrive</a> to enhance your database security posture.</p>Wed, 09 Apr 2025 00:00:00 GMTHyperdriveHyperdriveRules - Cloudflare Snippets are now Generally Availablehttps://developers.cloudflare.com/changelog/post/2025-04-09-snippets-ga/https://developers.cloudflare.com/changelog/post/2025-04-09-snippets-ga/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1999,height=1126,format=webp/_astro/snippets-ga.BJr3csvv.png" alt="Cloudflare Snippets are now GA" loading="lazy" decoding="async" width="1999" height="1126"> <p><a href="https://developers.cloudflare.com/rules/snippets/">Cloudflare Snippets</a> are now generally available at no extra cost across all paid plans — giving you a fast, flexible way to programmatically control HTTP traffic using lightweight JavaScript.</p> <p>You can now use Snippets to modify HTTP requests and responses with confidence, reliability, and scale. Snippets are production-ready and deeply integrated with Cloudflare Rules, making them ideal for everything from quick dynamic header rewrites to advanced routing logic.</p> <p>What's new:</p> <ul> <li> <p><strong>Snippets are now GA</strong> – Available at no extra cost on all Pro, Business, and Enterprise plans.</p> </li> <li> <p><strong>Ready for production</strong> – Snippets deliver a production-grade experience built for scale.</p> </li> <li> <p><strong>Part of the Cloudflare Rules platform</strong> – Snippets inherit request modifications from other Cloudflare products and support sequential execution, allowing you to run multiple Snippets on the same request and apply custom modifications step by step.</p> </li> <li> <p><strong>Trace integration</strong> – Use <a href="https://developers.cloudflare.com/rules/trace-request/">Cloudflare Trace</a> to see which Snippets were triggered on a request — helping you understand traffic flow and debug more effectively.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=334,format=webp/_astro/snippets-ga-trace.WlCshaFo.gif" alt="Snippets shown in Cloudflare Trace results" loading="lazy" decoding="async" width="800" height="334"></li></ul> <p>Learn more in the <a href="https://blog.cloudflare.com/snippets/" target="_blank" rel="noopener">launch blog post<span class="external-link"> ↗</span></a>.</p>Wed, 09 Apr 2025 00:00:00 GMTRulesRulesSecrets Store, SSL/TLS - Cloudflare Secrets Store now available in Betahttps://developers.cloudflare.com/changelog/post/2025-04-09-secrets-store-beta/https://developers.cloudflare.com/changelog/post/2025-04-09-secrets-store-beta/<p>Cloudflare Secrets Store is available today in Beta. You can now store, manage, and deploy account level secrets from a secure, centralized platform to your Workers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1914,height=1536,format=webp/_astro/secrets-store-landing-page.BQoEWsq8.png" alt="Import repo or choose template" loading="lazy" decoding="async" width="1914" height="1536"> <p>To spin up your Cloudflare Secrets Store, simply click the new Secrets Store tab <a href="http://dash.cloudflare.com/?to=/:account/secrets-store" target="_blank" rel="noopener">in the dashboard<span class="external-link"> ↗</span></a> or use this Wrangler command:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">wrangler</span><span class="nb-shiki-mdbnqw"> secrets-store</span><span class="nb-shiki-mdbnqw"> store</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">nam</span><span class="nb-shiki-140thh">e</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --remote</span></span></code></pre></figure> <p>The following are supported in the Secrets Store beta:</p> <ul> <li>Secrets Store UI &amp; API: create your store &amp; create, duplicate, update, scope, and delete a secret</li> <li>Workers UI: bind a new or existing account level secret to a Worker and deploy in code</li> <li>Wrangler: create your store &amp; create, duplicate, update, scope, and delete a secret</li> <li>Account Management UI &amp; API: assign Secrets Store permissions roles &amp; view audit logs for actions taken in Secrets Store core platform</li> </ul> <p>For instructions on how to get started, visit our <a href="https://developers.cloudflare.com/secrets-store/">developer documentation</a>.</p>Wed, 09 Apr 2025 00:00:00 GMTSecrets StoreSecrets StoreSSL/TLSWorkers - Investigate your Workers with the Query Builder in the new Observability dashboardhttps://developers.cloudflare.com/changelog/post/2025-04-09-qb-workers-logs-ga/https://developers.cloudflare.com/changelog/post/2025-04-09-qb-workers-logs-ga/ <p>The <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/" target="_blank" rel="noopener">Workers Observability dashboard<span class="external-link"> ↗</span></a> offers a single place to investigate and explore your <a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs">Workers Logs</a>.</p> <p>The <strong>Overview</strong> tab shows logs from all your Workers in one place. The <strong>Invocations</strong> view groups logs together by invocation, which refers to the specific trigger that started the execution of the Worker (i.e. fetch). The <strong>Events</strong> view shows logs in the order they were produced, based on timestamp. Previously, you could only view logs for a single Worker.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1680,height=626,format=webp/_astro/2025-04-09-workers-observability-overview.BKVvdscp.png" alt="Workers Observability Overview Tab" loading="lazy" decoding="async" width="1680" height="626"> <p>The <strong>Investigate</strong> tab presents a Query Builder, which helps you write structured queries to investigate and visualize your logs. The Query Builder can help answer questions such as:</p> <ul> <li>Which paths are experiencing the most 5XX errors?</li> <li>What is the wall time distribution by status code for my Worker?</li> <li>What are the slowest requests, and where are they coming from?</li> <li>Who are my top N users?</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2650,height=1318,format=webp/_astro/2025-04-09-query-builder.CaW9IZza.png" alt="Workers Observability Overview Tab" loading="lazy" decoding="async" width="2650" height="1318"> <p>The Query Builder can use any field that you store in your logs as a key to visualize, filter, and group by. Use the Query Builder to quickly access your data, build visualizations, save queries, and share them with your team.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-logs-is-now-generally-available">Workers Logs is now Generally Available</h4><a class="anchor-link" href="#workers-logs-is-now-generally-available"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs">Workers Logs</a> is now Generally Available. With a <a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs/#enable-workers-logs">small change</a> to your Wrangler configuration, Workers Logs ingests, indexes, and stores all logs emitted from your Workers for up to 7 days.</p> <p>We've introduced a number of changes during our beta period, including:</p> <ul> <li>Dashboard enhancements with customizable fields as columns in the Logs view and support for invocation-based grouping</li> <li>Performance improvements to ensure no adverse impact</li> <li>Public <a href="https://developers.cloudflare.com/api/resources/workers/subresources/observability/" target="_blank" rel="noopener">API endpoints<span class="external-link"> ↗</span></a> for broader consumption</li> </ul> <p>The API documents three endpoints: list the keys in the telemetry dataset, run a query, and list the unique values for a key. For more, visit our <a href="https://developers.cloudflare.com/api/resources/workers/subresources/observability/" target="_blank" rel="noopener">REST API documentation<span class="external-link"> ↗</span></a>.</p> <p>Visit the <a href="https://developers.cloudflare.com/workers/observability/query-builder">docs</a> to learn more about the capabilities and methods exposed by the Query Builder. Start using Workers Logs and the Query Builder today by enabling observability for your Workers:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "observability"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "enabled"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "logs"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "invocation_logs"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "head_sampling_rate"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-21nrsd"> // optional. default = 1.</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">observability</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">enabled = </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-1t8gfj">observability</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">logs</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> invocation_logs = </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh"> head_sampling_rate = </span><span class="nb-shiki-dzsirb">1</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script>Wed, 09 Apr 2025 00:00:00 GMTWorkersWorkersWorkers - CPU time and Wall time now published for Workers Invocationshttps://developers.cloudflare.com/changelog/post/2025-04-09-workers-timing/https://developers.cloudflare.com/changelog/post/2025-04-09-workers-timing/<p>You can now observe and investigate the CPU time and Wall time for every Workers Invocations.</p> <ul> <li>For <a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs">Workers Logs</a>, CPU time and Wall time are surfaced in the <a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs/#invocation-logs">Invocation Log</a>..</li> <li>For <a href="https://developers.cloudflare.com/workers/observability/logs/tail-workers">Tail Workers</a>, CPU time and Wall time are surfaced at the top level of the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events">Workers Trace Events object</a>.</li> <li>For <a href="https://developers.cloudflare.com/workers/observability/logs/logpush">Workers Logpush</a>, CPU and Wall time are surfaced at the top level of the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events">Workers Trace Events object</a>. All new jobs will have these new fields included by default. Existing jobs need to be updated to include CPU time and Wall time.</li> </ul> <p>You can use a Workers Logs filter to search for logs where Wall time exceeds 100ms.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=652,height=436,format=webp/_astro/2025-04-09-wall-time-filter.CT-VQyTS.png" alt="Workers Logs Wall Time Filter" loading="lazy" decoding="async" width="652" height="436"> <p>You can also use the Workers Observability <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/investigate" target="_blank" rel="noopener">Query Builder<span class="external-link"> ↗</span></a> to find the median CPU time and median Wall time for all of your Workers.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2650,height=1318,format=webp/_astro/2025-04-09-query-builder.CaW9IZza.png" alt="Query Builder filter" loading="lazy" decoding="async" width="2650" height="1318">Wed, 09 Apr 2025 00:00:00 GMTWorkersWorkersEmail Service - Local development support for Email Workershttps://developers.cloudflare.com/changelog/post/2025-04-08-local-development/https://developers.cloudflare.com/changelog/post/2025-04-08-local-development/<p>Email Workers enables developers to programmatically take action on anything that hits their email inbox. If you're building with Email Workers, you can now test the behavior of an Email Worker script, receiving, replying and sending emails in your local environment using <code>wrangler dev</code>.</p> <p>Below is an example that shows you how you can receive messages using the <code>email()</code> handler and parse them using <a href="https://www.npmjs.com/package/postal-mime" target="_blank" rel="noopener">postal-mime<span class="external-link"> ↗</span></a>:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-dzsirb"> *</span><span class="nb-shiki-1itgoe"> as</span><span class="nb-shiki-140thh"> PostalMime </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "postal-mime"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> email</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">message</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> parser</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-140thh"> PostalMime.</span><span class="nb-shiki-1t8gfj">default</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> rawEmail</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(message.raw);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> email</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> parser.</span><span class="nb-shiki-1t8gfj">parse</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> rawEmail.</span><span class="nb-shiki-1t8gfj">arrayBuffer</span><span class="nb-shiki-140thh">());</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(email);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Now when you run <code>npx wrangler dev</code>, wrangler will expose a local <code>/cdn-cgi/handler/email</code> endpoint that you can <code>POST</code> email messages to and trigger your Worker's <code>email()</code> handler:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'http://localhost:8787/cdn-cgi/handler/email'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url-query</span><span class="nb-shiki-mdbnqw"> 'from=sender@example.com'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --url-query</span><span class="nb-shiki-mdbnqw"> 'to=recipient@example.com'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data-raw</span><span class="nb-shiki-mdbnqw"> 'Received: from smtp.example.com (127.0.0.1)</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> by cloudflare-email.com (unknown) id 4fwwffRXOpyR</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> for &lt;recipient@example.com&gt;; Tue, 27 Aug 2024 15:50:20 +0000</span></span> <span class="line"><span class="nb-shiki-mdbnqw">From: "John" &lt;sender@example.com&gt;</span></span> <span class="line"><span class="nb-shiki-mdbnqw">Reply-To: sender@example.com</span></span> <span class="line"><span class="nb-shiki-mdbnqw">To: recipient@example.com</span></span> <span class="line"><span class="nb-shiki-mdbnqw">Subject: Testing Email Workers Local Dev</span></span> <span class="line"><span class="nb-shiki-mdbnqw">Content-Type: text/html; charset="windows-1252"</span></span> <span class="line"><span class="nb-shiki-mdbnqw">X-Mailer: Curl</span></span> <span class="line"><span class="nb-shiki-mdbnqw">Date: Tue, 27 Aug 2024 08:49:44 -0700</span></span> <span class="line"><span class="nb-shiki-mdbnqw">Message-ID: &lt;6114391943504294873000@ZSH-GHOSTTY&gt;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-mdbnqw">Hi there'</span></span></code></pre></figure> <p>This is what you get in the console:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "headers"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"received"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"from smtp.example.com (127.0.0.1) by cloudflare-email.com (unknown) id 4fwwffRXOpyR for &lt;recipient@example.com&gt;; Tue, 27 Aug 2024 15:50:20 +0000"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"from"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">John</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw"> &lt;sender@example.com&gt;"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"reply-to"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"sender@example.com"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"to"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"recipient@example.com"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"subject"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Testing Email Workers Local Dev"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"content-type"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/html; charset=</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">windows-1252</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"x-mailer"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Curl"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">"key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"date"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Tue, 27 Aug 2024 08:49:44 -0700"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "key"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"message-id"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "value"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;6114391943504294873000@ZSH-GHOSTTY&gt;"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "from"</span><span class="nb-shiki-140thh">: { </span><span class="nb-shiki-dzsirb">"address"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"sender@example.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"John"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "to"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"address"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"recipient@example.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">""</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "replyTo"</span><span class="nb-shiki-140thh">: [{ </span><span class="nb-shiki-dzsirb">"address"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"sender@example.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">"name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">""</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "subject"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Testing Email Workers Local Dev"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "messageId"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;6114391943504294873000@ZSH-GHOSTTY&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "date"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2024-08-27T15:49:44.000Z"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "html"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"Hi there</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "attachments"</span><span class="nb-shiki-140thh">: []</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Local development is a critical part of the development flow, and also works for sending, replying and forwarding emails. See <a href="https://developers.cloudflare.com/email-service/local-development/routing/">our documentation</a> for more information.</p>Tue, 08 Apr 2025 00:00:00 GMTEmail ServiceEmail ServiceHyperdrive - Hyperdrive Free plan makes fast, global database access available to allhttps://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-free-plan/https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-free-plan/<p>Hyperdrive is now available on the Free plan of Cloudflare Workers, enabling you to build Workers that connect to PostgreSQL or MySQL databases without compromise.</p> <p>Low-latency access to SQL databases is critical to building full-stack Workers applications. We want you to be able to build on fast, global apps on Workers, regardless of the tools you use. So we made Hyperdrive available for all, to make it easier to build Workers that connect to PostgreSQL and MySQL.</p> <p>If you want to learn more about how Hyperdrive works, read the <a href="https://blog.cloudflare.com/how-hyperdrive-speeds-up-database-access" target="_blank" rel="noopener">deep dive<span class="external-link"> ↗</span></a> on how Hyperdrive can make your database queries up to 4x faster.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=4800,height=2400,format=webp/_astro/hyperdrive-global-placement.DHxlaFbz.png" alt="Hyperdrive provides edge connection setup and global connection pooling for optimal latencies." loading="lazy" decoding="async" width="4800" height="2400"> <p>Visit the docs to <a href="https://developers.cloudflare.com/hyperdrive/get-started/">get started</a> with Hyperdrive for PostgreSQL or MySQL.</p>Tue, 08 Apr 2025 00:00:00 GMTHyperdriveHyperdriveHyperdrive - Hyperdrive introduces support for MySQL and MySQL-compatible databaseshttps://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-mysql-support/https://developers.cloudflare.com/changelog/post/2025-04-08-hyperdrive-mysql-support/ <p>Hyperdrive now supports connecting to MySQL and MySQL-compatible databases, including Amazon RDS and Aurora MySQL, Google Cloud SQL for MySQL, Azure Database for MySQL, PlanetScale and MariaDB.</p> <p>Hyperdrive makes your regional, MySQL databases fast when connecting from Cloudflare Workers. It eliminates unnecessary network roundtrips during connection setup, pools database connections globally, and can cache query results to provide the fastest possible response times.</p> <p>Best of all, you can connect using your existing drivers, ORMs, and query builders with Hyperdrive's secure credentials, no code changes required.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createConnection } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "mysql2/promise"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> HYPERDRIVE</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Hyperdrive</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> connection</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> createConnection</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> host: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.host,</span></span> <span class="line"><span class="nb-shiki-140thh"> user: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.user,</span></span> <span class="line"><span class="nb-shiki-140thh"> password: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.password,</span></span> <span class="line"><span class="nb-shiki-140thh"> database: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.database,</span></span> <span class="line"><span class="nb-shiki-140thh"> port: env.</span><span class="nb-shiki-dzsirb">HYPERDRIVE</span><span class="nb-shiki-140thh">.port,</span></span> <span class="line"><span class="nb-shiki-140thh"> disableEval: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// Required for Workers compatibility</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-dzsirb">results</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">fields</span><span class="nb-shiki-140thh">] </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> connection.</span><span class="nb-shiki-1t8gfj">query</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"SHOW tables;"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> ctx.</span><span class="nb-shiki-1t8gfj">waitUntil</span><span class="nb-shiki-140thh">(connection.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">());</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({ results, fields }), {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Content-Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"application/json"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Access-Control-Allow-Origin"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"*"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure> <p>Learn more about <a href="https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/">how Hyperdrive works</a> and <a href="https://developers.cloudflare.com/hyperdrive/get-started/">get started building Workers that connect to MySQL with Hyperdrive</a>.</p>Tue, 08 Apr 2025 00:00:00 GMTHyperdriveHyperdriveWorkers - Deploy a Workers application in seconds with one-clickhttps://developers.cloudflare.com/changelog/post/2025-04-08-deploy-to-cloudflare-button/https://developers.cloudflare.com/changelog/post/2025-04-08-deploy-to-cloudflare-button/<p>You can now add a <a href="https://developers.cloudflare.com/workers/platform/deploy-buttons/">Deploy to Cloudflare</a> button to the README of your Git repository containing a Workers application — making it simple for other developers to quickly set up and deploy your project!</p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/saas-admin-template" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare"></a></p> <p>The Deploy to Cloudflare button:</p> <ol> <li><strong>Creates a new Git repository on your GitHub/ GitLab account</strong>: Cloudflare will automatically clone and create a new repository on your account, so you can continue developing.</li> <li><strong>Automatically provisions resources the app needs</strong>: If your repository requires Cloudflare primitives like a <a href="https://developers.cloudflare.com/kv/">Workers KV namespace</a>, a <a href="https://developers.cloudflare.com/d1/">D1 database</a>, or an <a href="https://developers.cloudflare.com/r2/">R2 bucket</a>, Cloudflare will automatically provision them on your account and bind them to your Worker upon deployment.</li> <li><strong>Configures Workers Builds (CI/CD)</strong>: Every new push to your production branch on your newly created repository will automatically build and deploy courtesy of <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a>.</li> <li><strong>Adds preview URLs to each pull request</strong>: If you'd like to test your changes before deploying, you can push changes to a <a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-branches/#configure-non-production-branch-builds">non-production branch</a> and <a href="https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/">preview URLs</a> will be generated and <a href="https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/github-integration/#pull-request-comment">posted back to GitHub as a comment</a>.</li> </ol> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=4306,height=1344,format=webp/_astro/dtw-user-flow.zgS3Y8iK.png" alt="Import repo or choose template" loading="lazy" decoding="async" width="4306" height="1344"> <p>To create a Deploy to Cloudflare button in your README, you can add the following snippet, including your Git repository URL:</p> <figure class="nb-code-figure" data-nb-lang="md"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="md" data-nb-lang="md"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-9m66vu">![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)</span><span class="nb-shiki-140thh">](</span><span class="nb-shiki-1cpqx6">https://deploy.workers.cloudflare.com/?url=&lt;YOUR_GIT_REPO_URL&gt;</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>Check out our <a href="https://developers.cloudflare.com/workers/platform/deploy-buttons/">documentation</a> for more information on how to set up a deploy button for your application and best practices to ensure a successful deployment for other developers.</p>Tue, 08 Apr 2025 00:00:00 GMTWorkersWorkersWorkers, Workers for Platforms - Full-stack frameworks are now Generally Available on Cloudflare Workershttps://developers.cloudflare.com/changelog/post/2025-04-08-fullstack-on-workers/https://developers.cloudflare.com/changelog/post/2025-04-08-fullstack-on-workers/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1200,height=675,format=webp/_astro/fullstack-on-workers.D7fotYu2.png" alt="Full-stack on Cloudflare Workers" loading="lazy" decoding="async" width="1200" height="675"> <p>The following full-stack frameworks now have Generally Available ("GA") adapters for Cloudflare Workers, and are ready for you to use in production:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/">React Router v7 (Remix)</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/astro/">Astro</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/hono/">Hono</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/vue/">Vue.js</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/nuxt/">Nuxt</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/sveltekit/">Svelte (SvelteKit)</a></li> <li>And <a href="https://developers.cloudflare.com/workers/framework-guides/">more</a>.</li> </ul> <p>The following frameworks are now in <strong>beta</strong>, with GA support coming very soon:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/">Next.js</a>, supported through <a href="https://opennext.js.org/cloudflare" target="_blank" rel="noopener">@opennextjs/cloudflare<span class="external-link"> ↗</span></a> is now <code>v1.0-beta</code>.</li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/angular/">Angular</a></li> <li><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/solid/">SolidJS (SolidStart)</a></li> </ul> <p>You can also build complete full-stack apps on Workers <strong>without a framework</strong>:</p> <ul> <li>You can <a href="https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin" target="_blank" rel="noopener">“just use Vite"<span class="external-link"> ↗</span></a> and React together, and build a back-end API in the same Worker. Follow our <a href="https://developers.cloudflare.com/workers/vite-plugin/tutorial/">React SPA with an API tutorial</a> to learn how.</li> </ul> <p><strong>Get started building today with our <a href="https://developers.cloudflare.com/workers/framework-guides/">framework guides</a></strong>, or read our <a href="https://blog.cloudflare.com/full-stack-development-on-cloudflare-workers" target="_blank" rel="noopener">Developer Week 2025 blog post<span class="external-link"> ↗</span></a> about all the updates to building full-stack applications on Workers.</p>Tue, 08 Apr 2025 00:00:00 GMTWorkersWorkersWorkers for PlatformsWorkers - Improved support for Node.js Crypto and TLS APIs in Workershttps://developers.cloudflare.com/changelog/post/2025-04-08-nodejs-crypto-and-tls/https://developers.cloudflare.com/changelog/post/2025-04-08-nodejs-crypto-and-tls/ <p>When using a Worker with the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/"><code>nodejs_compat</code></a> compatibility flag enabled, the following Node.js APIs are now available:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/crypto/"><code>node:crypto</code></a></li> <li><a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/tls/"><code>node:tls</code></a></li> </ul> <p>This make it easier to reuse existing Node.js code in Workers or use npm packages that depend on these APIs.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nodecrypto">node:crypto</h4><a class="anchor-link" href="#nodecrypto"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The full <a href="https://nodejs.org/api/crypto.html" target="_blank" rel="noopener"><code>node:crypto</code><span class="external-link"> ↗</span></a> API is now available in Workers.</p> <p>You can use it to verify and sign data:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { sign, verify } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:crypto"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> signature</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> sign</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"sha256"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"-data to sign-"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">PRIVATE_KEY</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> verified</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> verify</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"sha256"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"-data to sign-"</span><span class="nb-shiki-140thh">, env.</span><span class="nb-shiki-dzsirb">PUBLIC_KEY</span><span class="nb-shiki-140thh">, signature);</span></span></code></pre></figure> <p>Or, to encrypt and decrypt data:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { publicEncrypt, privateDecrypt } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:crypto"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> encrypted</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> publicEncrypt</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">PUBLIC_KEY</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"some data"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> plaintext</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> privateDecrypt</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">PRIVATE_KEY</span><span class="nb-shiki-140thh">, encrypted);</span></span></code></pre></figure> <p>See the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/crypto/"><code>node:crypto</code> documentation</a> for more information.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nodetls">node:tls</h4><a class="anchor-link" href="#nodetls"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The following APIs from <code>node:tls</code> are now available:</p> <ul> <li><a href="https://nodejs.org/api/tls.html#tlsconnectoptions-callback" target="_blank" rel="noopener"><code>connect</code><span class="external-link"> ↗</span></a></li> <li><a href="https://nodejs.org/api/tls.html#class-tlstlssocket" target="_blank" rel="noopener"><code>TLSSocket</code><span class="external-link"> ↗</span></a></li> <li><a href="https://nodejs.org/api/tls.html#tlscheckserveridentityhostname-cert" target="_blank" rel="noopener"><code>checkServerIdentity</code><span class="external-link"> ↗</span></a></li> <li><a href="https://nodejs.org/api/tls.html#tlscreatesecurecontextoptions" target="_blank" rel="noopener"><code>createSecureContext</code><span class="external-link"> ↗</span></a></li> </ul> <p>This enables secure connections over TLS (Transport Layer Security) to external services.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { connect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:tls"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// ... in a request handler ...</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> connectionOptions</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> { key: env.</span><span class="nb-shiki-dzsirb">KEY</span><span class="nb-shiki-140thh">, cert: env.</span><span class="nb-shiki-dzsirb">CERT</span><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> socket</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> connect</span><span class="nb-shiki-140thh">(url, connectionOptions, () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (socket.authorized) {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Connection authorized"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">socket.</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"data"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">data</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(data);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">socket.</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"end"</span><span class="nb-shiki-140thh">, () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"server ends connection"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>See the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/tls/"><code>node:tls</code> documentation</a> for more information.</p>Tue, 08 Apr 2025 00:00:00 GMTWorkersWorkersWorkers - The Cloudflare Vite plugin is now Generally Availablehttps://developers.cloudflare.com/changelog/post/2025-04-08-vite-plugin/https://developers.cloudflare.com/changelog/post/2025-04-08-vite-plugin/<p>The <a href="https://developers.cloudflare.com/workers/vite-plugin/">Cloudflare Vite plugin</a> has <a href="https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin" target="_blank" rel="noopener">reached v1.0<span class="external-link"> ↗</span></a> and is now Generally Available ("GA").</p> <p>When you use <code>@cloudflare/vite-plugin</code>, you can use Vite's local development server and build tooling, while ensuring that while developing, your code runs in <a href="https://github.com/cloudflare/workerd" target="_blank" rel="noopener"><code>workerd</code><span class="external-link"> ↗</span></a>, the open-source Workers runtime.</p> <p>This lets you get the best of both worlds for a full-stack app — you can use <a href="https://vite.dev/guide/features.html#hot-module-replacement" target="_blank" rel="noopener">Hot Module Replacement<span class="external-link"> ↗</span></a> from Vite right alongside <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a> and other runtime APIs and bindings that are unique to Cloudflare Workers.</p> <p><code>@cloudflare/vite-plugin</code> is made possible by the new <a href="https://vite.dev/guide/api-environment" target="_blank" rel="noopener">environment API<span class="external-link"> ↗</span></a> in Vite, and was built <a href="https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin" target="_blank" rel="noopener">in partnership with the Vite team<span class="external-link"> ↗</span></a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="framework-support">Framework support</h4><a class="anchor-link" href="#framework-support"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can build any type of application with <code>@cloudflare/vite-plugin</code>, using any rendering mode, from single page applications (SPA) and static sites to server-side rendered (SSR) pages and API routes.</p> <p><a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/">React Router v7 (Remix)</a> is the first full-stack framework to provide full support for Cloudflare Vite plugin, allowing you to use all parts of Cloudflare's developer platform, without additional build steps.</p> <p>You can also build complete full-stack apps on Workers <strong>without a framework</strong> — <a href="https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin" target="_blank" rel="noopener">"just use Vite"<span class="external-link"> ↗</span></a> and React together, and build a back-end API in the same Worker. Follow our <a href="https://developers.cloudflare.com/workers/vite-plugin/tutorial/">React SPA with an API tutorial</a> to learn how.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="configuration">Configuration</h4><a class="anchor-link" href="#configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>If you're already using <a href="https://vite.dev/" target="_blank" rel="noopener">Vite<span class="external-link"> ↗</span></a> in your build and development toolchain, you can start using our plugin with minimal changes to your <code>vite.config.ts</code>:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">vite.config.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { defineConfig } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "vite"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { cloudflare } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/vite-plugin"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-1t8gfj"> defineConfig</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> plugins: [</span><span class="nb-shiki-1t8gfj">cloudflare</span><span class="nb-shiki-140thh">()],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure> <p>Take a look at the <a href="https://developers.cloudflare.com/workers/vite-plugin/">documentation for our Cloudflare Vite plugin</a> for more information!</p>Tue, 08 Apr 2025 00:00:00 GMTWorkersWorkersAgents, Workers - Build MCP servers with the Agents SDKhttps://developers.cloudflare.com/changelog/post/2025-04-07-mcp-servers-agents-sdk-updates/https://developers.cloudflare.com/changelog/post/2025-04-07-mcp-servers-agents-sdk-updates/ <p>The Agents SDK now includes built-in support for building remote MCP (Model Context Protocol) servers directly as part of your Agent. This allows you to easily create and manage MCP servers, without the need for additional infrastructure or configuration.</p> <p>The SDK includes a new <code>MCPAgent</code> class that extends the <code>Agent</code> class and allows you to expose resources and tools over the MCP protocol, as well as authorization and authentication to enable remote MCP servers.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyMCP</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> McpAgent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> McpServer</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"Demo"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> version: </span><span class="nb-shiki-mdbnqw">"1.0.0"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> init</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.server.</span><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`counter`</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">`mcp://resource/counter`</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">uri</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.server.</span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "add"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Add two numbers together"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { a: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">(), b: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">() },</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">a</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">b</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyMCP</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> McpAgent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> server</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> McpServer</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"Demo"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> version: </span><span class="nb-shiki-mdbnqw">"1.0.0"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> init</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.server.</span><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`counter`</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">`mcp://resource/counter`</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">uri</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.server.</span><span class="nb-shiki-1t8gfj">tool</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "add"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "Add two numbers together"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { a: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">(), b: z.</span><span class="nb-shiki-1t8gfj">number</span><span class="nb-shiki-140thh">() },</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">a</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">b</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>See <a href="https://github.com/cloudflare/agents/tree/main/examples/mcp" target="_blank" rel="noopener">the example<span class="external-link"> ↗</span></a> for the full code and as the basis for building your own MCP servers, and the <a href="https://github.com/cloudflare/agents/tree/main/examples/mcp-client" target="_blank" rel="noopener">client example<span class="external-link"> ↗</span></a> for how to build an Agent that acts as an MCP client.</p> <p>To learn more, review the <a href="https://blog.cloudflare.com/building-ai-agents-with-mcp-authn-authz-and-durable-objects" target="_blank" rel="noopener">announcement blog<span class="external-link"> ↗</span></a> as part of Developer Week 2025.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agents-sdk-updates">Agents SDK updates</h4><a class="anchor-link" href="#agents-sdk-updates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've made a number of improvements to the <a href="https://developers.cloudflare.com/agents/">Agents SDK</a>, including:</p> <ul> <li>Support for building MCP servers with the new <code>MCPAgent</code> class.</li> <li>The ability to export the current agent, request and WebSocket connection context using <code>import { context } from "agents"</code>, allowing you to minimize or avoid direct dependency injection when calling tools.</li> <li>Fixed a bug that prevented query parameters from being sent to the Agent server from the <code>useAgent</code> React hook.</li> <li>Automatically converting the <code>agent</code> name in <code>useAgent</code> or <code>useAgentChat</code> to kebab-case to ensure it matches the naming convention expected by <a href="https://developers.cloudflare.com/agents/runtime/communication/routing/"><code>routeAgentRequest</code></a>.</li> </ul> <p>To install or update the Agents SDK, run <code>npm i agents@latest</code> in an existing project, or explore the <code>agents-starter</code> project:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> cloudflare@latest</span><span class="nb-shiki-dzsirb"> --</span><span class="nb-shiki-dzsirb"> --template</span><span class="nb-shiki-mdbnqw"> cloudflare/agents-starter</span></span></code></pre></figure> <p>See the full release notes and changelog <a href="https://github.com/cloudflare/agents/blob/main/packages/agents/CHANGELOG.md" target="_blank" rel="noopener">on the Agents SDK repository<span class="external-link"> ↗</span></a> and</p>Mon, 07 Apr 2025 00:00:00 GMTAgentsAgentsWorkersAI Search, Vectorize - Create fully-managed RAG pipelines for your AI applications with AutoRAGhttps://developers.cloudflare.com/changelog/post/2025-04-07-autorag-open-beta/https://developers.cloudflare.com/changelog/post/2025-04-07-autorag-open-beta/<p><a href="https://developers.cloudflare.com/ai-search/">AutoRAG</a> is now in open beta, making it easy for you to build fully-managed retrieval-augmented generation (RAG) pipelines without managing infrastructure. Just upload your docs to <a href="https://developers.cloudflare.com/r2/get-started/">R2</a>, and AutoRAG handles the rest: embeddings, indexing, retrieval, and response generation via API.</p> <p>With AutoRAG, you can:</p> <ul> <li><strong>Customize your pipeline:</strong> Choose from <a href="https://developers.cloudflare.com/workers-ai">Workers AI</a> models, configure chunking strategies, edit system prompts, and more.</li> <li><strong>Instant setup:</strong> AutoRAG provisions everything you need from <a href="https://developers.cloudflare.com/vectorize">Vectorize</a>, <a href="https://developers.cloudflare.com/ai-gateway">AI gateway</a>, to pipeline logic for you, so you can go from zero to a working RAG pipeline in seconds.</li> <li><strong>Keep your index fresh:</strong> AutoRAG continuously syncs your index with your data source to ensure responses stay accurate and up to date.</li> <li><strong>Ask questions:</strong> Query your data and receive grounded responses via a <a href="https://developers.cloudflare.com/ai-search/api/search/workers-binding/">Workers binding</a> or <a href="https://developers.cloudflare.com/ai-search/api/search/rest-api/">API</a>.</li> </ul> <p>Whether you're building internal tools, AI-powered search, or a support assistant, AutoRAG gets you from idea to deployment in minutes.</p> <p>Get started in the <a href="https://dash.cloudflare.com/?to=/:account/ai/autorag" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> or check out the <a href="https://developers.cloudflare.com/ai-search/get-started/">guide</a> for instructions on how to build your RAG pipeline today.</p>Mon, 07 Apr 2025 00:00:00 GMTAI SearchAI SearchVectorizeBrowser Run - Browser Rendering REST API is Generally Available, with new endpoints and a free tierhttps://developers.cloudflare.com/changelog/post/2025-04-07-br-free-ga-playwright/https://developers.cloudflare.com/changelog/post/2025-04-07-br-free-ga-playwright/<p>We’re excited to announce Browser Rendering is now available on the <a href="https://www.cloudflare.com/plans/developer-platform/" target="_blank" rel="noopener">Workers Free plan<span class="external-link"> ↗</span></a>, making it even easier to prototype and experiment with web search and headless browser use-cases when building applications on Workers.</p> <p>The Browser Rendering <strong><a href="https://developers.cloudflare.com/browser-run/quick-actions/">REST API</a> is now Generally Available</strong>, allowing you to control browser instances from outside of Workers applications. We've added three new endpoints to help automate more browser tasks:</p> <ul> <li><strong>Extract structured data</strong> – Use <code>/json</code> to retrieve structured data from a webpage.</li> <li><strong>Retrieve links</strong> – Use <code>/links</code> to pull all links from a webpage.</li> <li><strong>Convert to Markdown</strong> – Use <code>/markdown</code> to convert webpage content into Markdown format.</li> </ul> <p>For example, to fetch the Markdown representation of a webpage:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Markdown example</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> 'POST'</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/&lt;accountId&gt;/browser-rendering/markdown'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span></span></code></pre></figure> <p>For the full list of endpoints, check out our <a href="https://developers.cloudflare.com/browser-run/quick-actions/">REST API documentation</a>. You can also interact with Browser Rendering via the <a href="https://github.com/cloudflare/cloudflare-typescript" target="_blank" rel="noopener">Cloudflare TypeScript SDK<span class="external-link"> ↗</span></a>.</p> <p>We also recently landed support for <a href="https://developers.cloudflare.com/browser-run/playwright/">Playwright</a> in Browser Rendering for browser automation from Cloudflare <a href="https://developers.cloudflare.com/workers/">Workers</a>, in addition to <a href="https://developers.cloudflare.com/browser-run/puppeteer/">Puppeteer</a>, giving you more flexibility to test across different browser environments.</p> <p>Visit the <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering docs</a> to learn more about how to use headless browsers in your applications.</p>Mon, 07 Apr 2025 00:00:00 GMTBrowser RunBrowser RunDurable Objects, Workers - Durable Objects on Workers Free planhttps://developers.cloudflare.com/changelog/post/2025-04-07-durable-objects-free-tier/https://developers.cloudflare.com/changelog/post/2025-04-07-durable-objects-free-tier/<p>Durable Objects can now be used with zero commitment on the <a href="https://developers.cloudflare.com/workers/platform/pricing/">Workers Free plan</a> allowing you to build AI agents with <a href="https://developers.cloudflare.com/agents/">Agents SDK</a>, collaboration tools, and real-time applications like chat or multiplayer games.</p> <p>Durable Objects let you build stateful, serverless applications with millions of tiny coordination instances that run your application code alongside (in the same thread!) your durable storage. Each Durable Object can access its own SQLite database through a <a href="https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/">Storage API</a>. A Durable Object class is defined in a Worker script encapsulating the Durable Object's behavior when accessed from a Worker. To try the code below, click the button:</p> <p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/hello-world-do-template" target="_blank" rel="noopener"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare"></a></p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Durable Object</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyDurableObject</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> ...</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> sayHello</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">name</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-mdbnqw"> `Hello, ${</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}!`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Worker</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Every unique ID refers to an individual instance of the Durable Object class</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">idFromName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"foo"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // A stub is a client used to invoke methods on the Durable Object</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> stub</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_DURABLE_OBJECT</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(id);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Methods on the Durable Object are invoked via the stub</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> stub.</span><span class="nb-shiki-1t8gfj">sayHello</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"world"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Free plan <a href="https://developers.cloudflare.com/durable-objects/platform/pricing/">limits</a> apply to Durable Objects compute and storage usage. Limits allow developers to build real-world applications, with every Worker request able to call a Durable Object on the free plan.</p> <p>For more information, checkout:</p> <ul> <li><a href="https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/">Documentation</a></li> <li><a href="https://blog.cloudflare.com/sqlite-in-durable-objects/" target="_blank" rel="noopener">Zero-latency SQLite storage in every Durable Object blog<span class="external-link"> ↗</span></a></li> </ul>Mon, 07 Apr 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersDurable Objects, Workers - SQLite in Durable Objects GA with 10GB storage per objecthttps://developers.cloudflare.com/changelog/post/2025-04-07-sqlite-in-durable-objects-ga/https://developers.cloudflare.com/changelog/post/2025-04-07-sqlite-in-durable-objects-ga/<p>SQLite in Durable Objects is now generally available (GA) with 10GB SQLite database per Durable Object. Since the <a href="https://blog.cloudflare.com/sqlite-in-durable-objects/" target="_blank" rel="noopener">public beta<span class="external-link"> ↗</span></a> in September 2024, we've added feature parity and robustness for the SQLite storage backend compared to the preexisting key-value (KV) storage backend for Durable Objects.</p> <p>SQLite-backed Durable Objects are recommended for all new Durable Object classes, using <code>new_sqlite_classes</code> <a href="https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class">Wrangler configuration</a>. Only SQLite-backed Durable Objects have access to Storage API's <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#sql-api">SQL</a> and <a href="https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#pitr-point-in-time-recovery-api">point-in-time recovery</a> methods, which provide relational data modeling, SQL querying, and better data management.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyDurableObject</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> sql</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> SqlStorage</span></span> <span class="line"><span class="nb-shiki-1itgoe"> constructor</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> DurableObjectState</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> super</span><span class="nb-shiki-140thh">(ctx, env);</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.sql </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> ctx.storage.sql;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> sayHello</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> result </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.sql</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">exec</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"SELECT 'Hello, World!' AS greeting"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">one</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> result.greeting;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>KV-backed Durable Objects remain for backwards compatibility, and a migration path from key-value storage to SQL storage for existing Durable Object classes will be offered in the future.</p> <p>For more details on SQLite storage, checkout <a href="https://blog.cloudflare.com/sqlite-in-durable-objects/" target="_blank" rel="noopener">Zero-latency SQLite storage in every Durable Object blog<span class="external-link"> ↗</span></a>.</p>Mon, 07 Apr 2025 00:00:00 GMTDurable ObjectsDurable ObjectsWorkersWorkers - Capture up to 256 KB of log events in each Workers Invocationhttps://developers.cloudflare.com/changelog/post/2025-04-07-increase-trace-events-limit/https://developers.cloudflare.com/changelog/post/2025-04-07-increase-trace-events-limit/<p>You can now capture a maximum of 256 KB of log events per Workers invocation, helping you gain better visibility into application behavior.</p> <p>All console.log() statements, exceptions, request metadata, and headers are automatically captured during the Worker invocation and emitted as <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/workers_trace_events">JSON object</a>. <a href="https://developers.cloudflare.com/workers/observability/logs/workers-logs">Workers Logs</a> deserializes this object before indexing the fields and storing them. You can also capture, transform, and export the JSON object in a <a href="https://developers.cloudflare.com/workers/observability/logs/tail-workers">Tail Worker</a>.</p> <p>256 KB is a 2x increase from the previous 128 KB limit. After you exceed this limit, further context associated with the request will not be recorded in your logs.</p> <p>This limit is automatically applied to all Workers.</p>Mon, 07 Apr 2025 00:00:00 GMTWorkersWorkersWorkflows, Workers - Workflows is now Generally Availablehttps://developers.cloudflare.com/changelog/post/2025-04-07-workflows-ga/https://developers.cloudflare.com/changelog/post/2025-04-07-workflows-ga/ <p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> is now <em>Generally Available</em> (or "GA"): in short, it's ready for production workloads. Alongside marking Workflows as GA, we've introduced a number of changes during the beta period, including:</p> <ul> <li>A new <code>waitForEvent</code> API that allows a Workflow to wait for an event to occur before continuing execution.</li> <li>Increased concurrency: you can <a href="https://developers.cloudflare.com/changelog/2025-02-25-workflows-concurrency-increased/">run up to 4,500 Workflow instances</a> concurrently — and this will continue to grow.</li> <li>Improved observability, including new CPU time metrics that allow you to better understand which Workflow instances are consuming the most resources and/or contributing to your bill.</li> <li>Support for <code>vitest</code> for testing Workflows locally and in CI/CD pipelines.</li> </ul> <p>Workflows also supports the new <a href="https://developers.cloudflare.com/changelog/2025-03-25-higher-cpu-limits/">increased CPU limits</a> that apply to Workers, allowing you to run more CPU-intensive tasks (up to 5 minutes of CPU time per instance), not including the time spent waiting on network calls, AI models, or other I/O bound tasks.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="human-in-the-loop">Human-in-the-loop</h4><a class="anchor-link" href="#human-in-the-loop"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The new <code>step.waitForEvent</code> API allows a Workflow instance to wait on events and data, enabling human-in-the-the-loop interactions, such as approving or rejecting a request, directly handling webhooks from other systems, or pushing event data to a Workflow while it's running.</p> <p>Because Workflows are just code, you can conditionally execute code based on the result of a <code>waitForEvent</code> call, and/or call <code>waitForEvent</code> multiple times in a single Workflow based on what the Workflow needs.</p> <p>For example, if you wanted to implement a human-in-the-loop approval process, you could use <code>waitForEvent</code> to wait for a user to approve or reject a request, and then conditionally execute code based on the result.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowEntrypoint,</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowStep,</span></span> <span class="line"><span class="nb-shiki-140thh"> WorkflowEvent,</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkflowEntrypoint</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Other steps in your Workflow</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> stripeEvent </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">waitForEvent</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "receive invoice paid webhook from Stripe"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"stripe-webhook"</span><span class="nb-shiki-140thh">, timeout: </span><span class="nb-shiki-mdbnqw">"1 hour"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Rest of your Workflow</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyWorkflow</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> WorkflowEntrypoint</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1t8gfj">Params</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">event</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowEvent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Params</span><span class="nb-shiki-140thh">&gt;, </span><span class="nb-shiki-1jdh33">step</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> WorkflowStep</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Other steps in your Workflow</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> stripeEvent </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">waitForEvent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">IncomingStripeWebhook</span><span class="nb-shiki-140thh">&gt;(</span><span class="nb-shiki-mdbnqw">"receive invoice paid webhook from Stripe"</span><span class="nb-shiki-140thh">, { type: </span><span class="nb-shiki-mdbnqw">"stripe-webhook"</span><span class="nb-shiki-140thh">, timeout: </span><span class="nb-shiki-mdbnqw">"1 hour"</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Rest of your Workflow</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>You can then send a Workflow an event from an external service via HTTP or from within a Worker using the <a href="https://developers.cloudflare.com/workflows/build/workers-api/">Workers API</a> for Workflows:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> instanceId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(req.url).searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"instanceId"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> webhookPayload</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> req.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> instance </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_WORKFLOW</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(instanceId);</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Send our event, with `type` matching the event type defined in</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // our step.waitForEvent call</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">sendEvent</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"stripe-webhook"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> payload: webhookPayload,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> status: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">status</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> instanceId</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(req.url).searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"instanceId"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> webhookPayload</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> req.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Payload</span><span class="nb-shiki-140thh">&gt;()</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> instance </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">MY_WORKFLOW</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(instanceId);</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Send our event, with `type` matching the event type defined in</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // our step.waitForEvent call</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">sendEvent</span><span class="nb-shiki-140thh">({type: </span><span class="nb-shiki-mdbnqw">"stripe-webhook"</span><span class="nb-shiki-140thh">, payload: webhookPayload})</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> status: </span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">status</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div></div> <p>Read the <a href="https://blog.cloudflare.com/workflows-is-now-generally-available/" target="_blank" rel="noopener">GA announcement blog<span class="external-link"> ↗</span></a> to learn more about what landed as part of the Workflows GA.</p>Mon, 07 Apr 2025 00:00:00 GMTWorkflowsWorkflowsWorkersBrowser Run - Playwright for Browser Rendering now availablehttps://developers.cloudflare.com/changelog/post/2025-04-04-playwright-beta/https://developers.cloudflare.com/changelog/post/2025-04-04-playwright-beta/<p>We're excited to share that you can now use Playwright's browser automation <a href="https://playwright.dev/docs/api/class-playwright" target="_blank" rel="noopener">capabilities<span class="external-link"> ↗</span></a> from Cloudflare <a href="https://developers.cloudflare.com/workers/">Workers</a>.</p> <p><a href="https://playwright.dev/" target="_blank" rel="noopener">Playwright<span class="external-link"> ↗</span></a> is an open-source package developed by Microsoft that can do browser automation tasks; it's commonly used to write software tests, debug applications, create screenshots, and crawl pages. Like <a href="https://developers.cloudflare.com/browser-run/puppeteer/">Puppeteer</a>, we <a href="https://github.com/cloudflare/playwright" target="_blank" rel="noopener">forked<span class="external-link"> ↗</span></a> Playwright and modified it to be compatible with Cloudflare Workers and <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a>.</p> <p>Below is an example of how to use Playwright with Browser Rendering to test a TODO application using assertions:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">Assertion example</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { launch, </span><span class="nb-shiki-1itgoe">type</span><span class="nb-shiki-140thh"> BrowserWorker } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/playwright"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { expect } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "@cloudflare/playwright/test"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> MYBROWSER</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> BrowserWorker</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> browser</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> launch</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">MYBROWSER</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> page</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">newPage</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">goto</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://demo.playwright.dev/todomvc"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> TODO_ITEMS</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "buy some cheese"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "feed the cat"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "book a doctors appointment"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> ];</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> newTodo</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">getByPlaceholder</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"What needs to be done?"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> item</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-dzsirb"> TODO_ITEMS</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> newTodo.</span><span class="nb-shiki-1t8gfj">fill</span><span class="nb-shiki-140thh">(item);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> newTodo.</span><span class="nb-shiki-1t8gfj">press</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Enter"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(page.</span><span class="nb-shiki-1t8gfj">getByTestId</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"todo-title"</span><span class="nb-shiki-140thh">)).</span><span class="nb-shiki-1t8gfj">toHaveCount</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">TODO_ITEMS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-dzsirb">length</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">all</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-dzsirb"> TODO_ITEMS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">map</span><span class="nb-shiki-140thh">((</span><span class="nb-shiki-1jdh33">value</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">index</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> expect</span><span class="nb-shiki-140thh">(page.</span><span class="nb-shiki-1t8gfj">getByTestId</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"todo-title"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">nth</span><span class="nb-shiki-140thh">(index)).</span><span class="nb-shiki-1t8gfj">toHaveText</span><span class="nb-shiki-140thh">(value),</span></span> <span class="line"><span class="nb-shiki-140thh"> ),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Playwright is available as an npm package at <a href="https://www.npmjs.com/package/@cloudflare/playwright" target="_blank" rel="noopener"><code>@cloudflare/playwright</code><span class="external-link"> ↗</span></a> and the code is at <a href="https://github.com/cloudflare/playwright" target="_blank" rel="noopener">GitHub<span class="external-link"> ↗</span></a>.</p> <p>Learn more in our <a href="https://developers.cloudflare.com/browser-run/playwright/">documentation</a>.</p>Fri, 04 Apr 2025 00:00:00 GMTBrowser RunBrowser RunCache - Workers Fetch API can override Cache Ruleshttps://developers.cloudflare.com/changelog/post/2025-04-04-workers-fetch-api-override-cache-rules/https://developers.cloudflare.com/changelog/post/2025-04-04-workers-fetch-api-override-cache-rules/<p>You can now programmatically override Cache Rules using the <code>cf</code> object in the <code>fetch()</code> command. This feature gives you fine-grained control over caching behavior on a per-request basis, allowing Workers to customize cache settings dynamically based on request properties, user context, or business logic.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Using the <code>cf</code> object in <code>fetch()</code>, you can override specific Cache Rules settings by:</p> <ol> <li><strong>Setting custom cache options</strong>: Pass cache properties in the <code>cf</code> object as the second argument to <code>fetch()</code> to override default Cache Rules.</li> <li><strong>Dynamic cache control</strong>: Apply different caching strategies based on request headers, cookies, or other runtime conditions.</li> <li><strong>Per-request customization</strong>: Bypass or modify Cache Rules for individual requests while maintaining default behavior for others.</li> <li><strong>Programmatic cache management</strong>: Implement complex caching logic that adapts to your application's needs.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-can-be-configured">What can be configured</h4><a class="anchor-link" href="#what-can-be-configured"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Workers can override the following Cache Rules settings through the <code>cf</code> object:</p> <ul> <li><strong><code>cacheEverything</code></strong>: Treat all content as static and cache all file types beyond the default cached content.</li> <li><strong><code>cacheTtl</code></strong>: Set custom time-to-live values in seconds for cached content at the edge, regardless of origin headers.</li> <li><strong><code>cacheTtlByStatus</code></strong>: Set different TTLs based on the response status code (for example, <code>{ "200-299": 86400, 404: 1, "500-599": 0 }</code>).</li> <li><strong><code>cacheKey</code></strong>: Customize cache keys to control which requests are treated as the same for caching purposes (Enterprise only).</li> <li><strong><code>cacheTags</code></strong>: Append additional cache tags for targeted cache purging operations.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Enhanced flexibility</strong>: Customize cache behavior without modifying zone-level Cache Rules.</li> <li><strong>Dynamic optimization</strong>: Adjust caching strategies in real-time based on request context.</li> <li><strong>Simplified configuration</strong>: Reduce the number of Cache Rules needed by handling edge cases programmatically.</li> <li><strong>Improved performance</strong>: Fine-tune cache behavior for specific use cases to maximize hit rates.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, refer to the <a href="https://developers.cloudflare.com/workers/runtime-apis/fetch/">Workers Fetch API documentation</a> and the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties">cf object properties documentation</a>.</p>Fri, 04 Apr 2025 00:00:00 GMTCacheCacheCache - All cache purge methods now available for all planshttps://developers.cloudflare.com/changelog/post/2025-04-01-purge-for-all/https://developers.cloudflare.com/changelog/post/2025-04-01-purge-for-all/<p>You can now access all Cloudflare cache purge methods — no matter which plan you’re on. Whether you need to update a single asset or instantly invalidate large portions of your site’s content, you now have the same powerful tools previously reserved for Enterprise customers.</p> <p><strong>Anyone on Cloudflare can now:</strong></p> <ol> <li><a href="https://developers.cloudflare.com/cache/how-to/purge-cache/purge-everything/">Purge Everything</a>: Clears all cached content associated with a website.</li> <li><a href="https://developers.cloudflare.com/cache/how-to/purge-cache/purge_by_prefix/">Purge by Prefix</a>: Targets URLs sharing a common prefix.</li> <li><a href="https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-hostname/">Purge by Hostname</a>: Invalidates content by specific hostnames.</li> <li><a href="https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-single-file/">Purge by URL (single-file purge)</a>: Precisely targets individual URLs.</li> <li><a href="https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-tags/">Purge by Tag</a>: Uses Cache-Tag response headers to invalidate grouped assets, offering flexibility for complex cache management scenarios.</li> </ol> <p>Want to learn how each purge method works, when to use them, or what limits apply to your plan? Dive into our <a href="https://developers.cloudflare.com/cache/how-to/purge-cache/">purge cache documentation</a> and <a href="https://developers.cloudflare.com/api/resources/cache/methods/purge/" target="_blank" rel="noopener">API reference<span class="external-link"> ↗</span></a> for all the details.</p>Thu, 03 Apr 2025 00:00:00 GMTCacheCacheWAF - WAF Release - 2025-04-02https://developers.cloudflare.com/changelog/post/2025-04-02-waf-release/https://developers.cloudflare.com/changelog/post/2025-04-02-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8b8074e73b7d4aba92fc68f3622f0483"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...622f0483</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100732</td><td>Sitecore - Code Injection - CVE:CVE-2025-27218</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8350947451a1401c934f5e660f101cca"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0f101cca</span></button></rule-id></td><td>100733</td><td><p>Angular-Base64-Upload - Remote Code Execution - CVE:CVE-2024-42640</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="a9ec9cf625ff42769298671d1bbcd247"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1bbcd247</span></button></rule-id></td><td>100734</td><td>Apache Camel - Remote Code Execution - CVE:CVE-2025-29891</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3d6bf99039b54312a1a2165590aea1ca"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...90aea1ca</span></button></rule-id></td><td>100735</td><td><p>Progress Software WhatsUp Gold - Remote Code Execution - CVE:CVE-2024-4885</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d104e3246dc14ac7851b4049d9d8c5f2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d9d8c5f2</span></button></rule-id></td><td>100737</td><td>Apache Tomcat - Remote Code Execution - CVE:CVE-2025-24813</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="21c7a963e1b749e7b1753238a28a42c4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a28a42c4</span></button></rule-id></td><td>100659</td><td>Common Payloads for Server-side Template Injection</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="887843ffbe90436dadd1543adaa4b037"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...daa4b037</span></button></rule-id></td><td>100659</td><td>Common Payloads for Server-side Template Injection - Base64</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="3565b80fc5b541b4832c0fc848f6a9cf"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...48f6a9cf</span></button></rule-id></td><td>100642</td><td>LDAP Injection</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="44d7bf9bf0fa4898b8579573e0713e9f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e0713e9f</span></button></rule-id></td><td>100642</td><td>LDAP Injection Base64</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="e35c9a670b864a3ba0203ffb1bc977d1"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1bc977d1</span></button></rule-id></td><td>100005</td><td><p>DotNetNuke - File Inclusion - CVE:CVE-2018-9126, CVE:CVE-2011-1892, CVE:CVE-2022-31474</p></td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="cd8db44032694fdf8d6e22c1bb70a463"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bb70a463</span></button></rule-id></td><td>100527</td><td>Apache Struts - CVE:CVE-2021-31805</td><td>N/A</td><td>Block</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0d838d9ab046443fa3f8b3e50c99546a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0c99546a</span></button></rule-id></td><td>100702</td><td>Command Injection - CVE:CVE-2022-24108</td><td>N/A</td><td>Block</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="533fbad558ce4c5ebcf013f09a5581d0"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9a5581d0</span></button></rule-id></td><td>100622C</td><td><p>Ivanti - Command Injection - CVE:CVE-2023-46805, CVE:CVE-2024-21887, CVE:CVE-2024-22024</p></td><td>N/A</td><td>Block</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="04176552f62f4b75bf65981206d0b009"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...06d0b009</span></button></rule-id></td><td>100536C</td><td>GraphQL Command Injection</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="25883bf28575433c952b830c1651d0c8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1651d0c8</span></button></rule-id></td><td>100536</td><td>GraphQL Injection</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="7b70da1bb8d243bd80cd7a73af00f61d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...af00f61d</span></button></rule-id></td><td>100536A</td><td>GraphQL Introspection</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="58c4853c250946359472b7eaa41e5b67"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a41e5b67</span></button></rule-id></td><td>100536B</td><td>GraphQL SSRF</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="1c241ed5f5bd44b19e17476b433e5b3d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...433e5b3d</span></button></rule-id></td><td>100559A</td><td>Prototype Pollution - Common Payloads</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="af748489e1c2411d80d855954816b26f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4816b26f</span></button></rule-id></td><td>100559A</td><td>Prototype Pollution - Common Payloads - Base64</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="ccc47ab7e34248c09546c284fcea5ed2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fcea5ed2</span></button></rule-id></td><td>100734</td><td>Apache Camel - Remote Code Execution - CVE:CVE-2025-29891</td><td>N/A</td><td>Disabled</td><td>N/A</td></tr></tbody></table>Wed, 02 Apr 2025 00:00:00 GMTWAFWAFEmail security - CASB and Email securityhttps://developers.cloudflare.com/changelog/post/2025-04-01-casb-email-security/https://developers.cloudflare.com/changelog/post/2025-04-01-casb-email-security/<p>With Email security, you get two free CASB integrations.</p> <p>Use one SaaS integration for Email security to sync with your directory of users, take actions on delivered emails, automatically provide EMLs for reclassification requests for clean emails, discover CASB findings and more.</p> <p>With the other integration, you can have a separate SaaS integration for CASB findings for another SaaS provider.</p> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/">Add an integration</a> to learn more about this feature.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=727,height=502,format=webp/_astro/CASB-EmailSecurity.B1wd9be2.png" alt="CASB-EmailSecurity" loading="lazy" decoding="async" width="727" height="502"> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Tue, 01 Apr 2025 23:22:49 GMTEmail securityEmail securityQueues - New Pause & Purge APIs for Queueshttps://developers.cloudflare.com/changelog/post/2025-03-25-pause-purge-queues/https://developers.cloudflare.com/changelog/post/2025-03-25-pause-purge-queues/<p><a href="https://developers.cloudflare.com/queues/">Queues</a> now supports the ability to pause message delivery and/or purge (delete) messages on a queue. These operations can be useful when:</p> <ul> <li>Your consumer has a bug or downtime, and you want to temporarily stop messages from being processed while you fix the bug</li> <li>You have pushed invalid messages to a queue due to a code change during development, and you want to clean up the backlog</li> <li>Your queue has a backlog that is stale and you want to clean it up to allow new messages to be consumed</li> </ul> <p>To pause a queue using <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, run the <code>pause-delivery</code> command. Paused queues continue to receive messages. And you can easily unpause a queue using the <code>resume-delivery</code> command.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Pause and resume a queue</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> pause-delivery</span><span class="nb-shiki-mdbnqw"> my-queue</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Pausing</span><span class="nb-shiki-mdbnqw"> message</span><span class="nb-shiki-mdbnqw"> delivery</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> my-queue.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Paused</span><span class="nb-shiki-mdbnqw"> message</span><span class="nb-shiki-mdbnqw"> delivery</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> my-queue.</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> resume-delivery</span><span class="nb-shiki-mdbnqw"> my-queue</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Resuming</span><span class="nb-shiki-mdbnqw"> message</span><span class="nb-shiki-mdbnqw"> delivery</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> my-queue.</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Resumed</span><span class="nb-shiki-mdbnqw"> message</span><span class="nb-shiki-mdbnqw"> delivery</span><span class="nb-shiki-mdbnqw"> for</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> my-queue.</span></span></code></pre></figure> <p>Purging a queue permanently deletes all messages in the queue. Unlike pausing, purging is an irreversible operation:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Purge a queue</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> purge</span><span class="nb-shiki-mdbnqw"> my-queue</span></span> <span class="line"><span class="nb-shiki-1t8gfj">✔</span><span class="nb-shiki-mdbnqw"> This</span><span class="nb-shiki-mdbnqw"> operation</span><span class="nb-shiki-mdbnqw"> will</span><span class="nb-shiki-mdbnqw"> permanently</span><span class="nb-shiki-mdbnqw"> delete</span><span class="nb-shiki-mdbnqw"> all</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> messages</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> my-queue.</span><span class="nb-shiki-mdbnqw"> Type</span><span class="nb-shiki-mdbnqw"> my-queue</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> proceed.</span><span class="nb-shiki-mdbnqw"> …</span><span class="nb-shiki-mdbnqw"> my-queue</span></span> <span class="line"><span class="nb-shiki-1t8gfj">Purged</span><span class="nb-shiki-mdbnqw"> queue</span><span class="nb-shiki-mdbnqw"> 'my-queue'</span></span></code></pre></figure> <p>You can also do these operations using the <a href="https://developers.cloudflare.com/api/resources/queues/">Queues REST API</a>, or the dashboard page for a queue.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2200,height=574,format=webp/_astro/pause-purge.SQ7B3RCF.png" alt="Pause and purge using the dashboard" loading="lazy" decoding="async" width="2200" height="574"> <p>This feature is available on all new and existing queues. Head over to the <a href="https://developers.cloudflare.com/queues/configuration/pause-purge">pause and purge documentation</a> to learn more. And if you haven't used Cloudflare Queues before, <a href="https://developers.cloudflare.com/queues/get-started">get started with the Cloudflare Queues guide</a>.</p>Thu, 27 Mar 2025 12:00:00 GMTQueuesQueuesRegistrar - Register and renew .ai and .shop domains at costhttps://developers.cloudflare.com/changelog/post/2025-03-27-ai-domains-available/https://developers.cloudflare.com/changelog/post/2025-03-27-ai-domains-available/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1788,height=818,format=webp/_astro/2025-03-27-ai-domains-available.D96eztke.png" alt="Example search for .ai domains" loading="lazy" decoding="async" width="1788" height="818"> <p>Cloudflare Registrar now supports <code>.ai</code> and <code>.shop</code> domains. These are two of our most highly-requested top-level domains (TLDs) and are great additions to the <a href="https://domains.cloudflare.com/tlds" target="_blank" rel="noopener">300+ other TLDs we support<span class="external-link"> ↗</span></a>.</p> <p>Starting today, customers can:</p> <ul> <li>Register and renew these domains <em>at cost</em> without any markups or add-on fees</li> <li>Enjoy best-in-class security and performance with native integrations with Cloudflare DNS, CDN, and SSL services like one-click DNSSEC</li> <li>Combat domain hijacking with <a href="https://www.cloudflare.com/products/registrar/custom-domain-protection/" target="_blank" rel="noopener">Custom Domain Protection<span class="external-link"> ↗</span></a> (available on enterprise plans)</li> </ul> <p>We can't wait to see what AI and e-commerce projects you deploy on Cloudflare. To get started, transfer your domains to Cloudflare or <a href="https://domains.cloudflare.com/" target="_blank" rel="noopener">search for new ones to register<span class="external-link"> ↗</span></a>.</p>Thu, 27 Mar 2025 10:00:00 GMTRegistrarRegistrarAudit Logs - Audit logs (version 2) - Beta Releasehttps://developers.cloudflare.com/changelog/post/2025-03-27-automatic-audit-logs-beta-release/https://developers.cloudflare.com/changelog/post/2025-03-27-automatic-audit-logs-beta-release/<p>The latest version of audit logs streamlines audit logging by automatically capturing all user and system actions performed through the Cloudflare Dashboard or public APIs. This update leverages Cloudflare’s existing API Shield to generate audit logs based on OpenAPI schemas, ensuring a more consistent and automated logging process.</p> <p>Availability: Audit logs (version 2) is now in Beta, with support limited to <strong>API access</strong>.</p> <p>Use the following API endpoint to retrieve audit logs:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-dzsirb">GET</span><span class="nb-shiki-1t8gfj"> https</span><span class="nb-shiki-140thh">:</span><span class="nb-shiki-21nrsd">//api.cloudflare.com/client/v4/accounts/&lt;account_id&gt;/logs/audit?since=&lt;date&gt;&amp;before=&lt;date&gt;</span></span></code></pre></figure> <p>You can access detailed documentation for audit logs (version 2) Beta API release <a href="https://developers.cloudflare.com/api/resources/accounts/subresources/logs/subresources/audit/methods/list/" target="_blank" rel="noopener">here<span class="external-link"> ↗</span></a>.</p> <p><strong>Key Improvements in the Beta Release:</strong></p> <ul> <li> <p><strong>Automated &amp; standardized logging</strong>: Logs are now generated automatically using a standardized system, replacing manual, team-dependent logging. This ensures consistency across all Cloudflare services.</p> </li> <li> <p><strong>Expanded product coverage</strong>: Increased audit log coverage from 75% to 95%. Key API endpoints such as <code>/accounts</code>, <code>/zones</code>, and <code>/organizations</code> are now included.</p> </li> <li> <p><strong>Granular filtering</strong>: Logs now follow a uniform format, enabling precise filtering by actions, users, methods, and resources—allowing for faster and more efficient investigations.</p> </li> <li> <p><strong>Enhanced context and traceability</strong>: Each log entry now includes detailed context, such as the authentication method used, the interface (API or Dashboard) through which the action was performed, and mappings to Cloudflare Ray IDs for better traceability.</p> </li> <li> <p><strong>Comprehensive activity capture</strong>: Expanded logging to include GET requests and failed attempts, ensuring that all critical activities are recorded.</p> </li> </ul> <p><strong>Known Limitations in Beta</strong></p> <ul> <li>Error handling for the API is not implemented.</li> <li>There may be gaps or missing entries in the available audit logs.</li> <li>UI is unavailable in this Beta release.</li> <li>System-level logs and User-Activity logs are not included.</li> </ul> <p>Support for these features is coming as part of the GA release later this year. For more details, including a sample audit log, check out our blog post: <a href="https://blog.cloudflare.com/introducing-automatic-audit-logs/" target="_blank" rel="noopener">Introducing Automatic Audit Logs<span class="external-link"> ↗</span></a></p>Thu, 27 Mar 2025 00:00:00 GMTAudit LogsAudit LogsCloudflare Fundamentals - Updates to Account Home - Quick actions, traffic insights, Workers projects, and morehttps://developers.cloudflare.com/changelog/post/2025-03-26-account-home-updates/https://developers.cloudflare.com/changelog/post/2025-03-26-account-home-updates/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2574,height=982,format=webp/_astro/2025-03-26-account-home-updates.CcOsD1dD.png" alt="Updated Account Home" loading="lazy" decoding="async" width="2574" height="982"> <p>Recently, Account Home has been updated to streamline your workflows:</p> <ul> <li> <p><strong>Recent Workers projects</strong>: You'll now find your projects readily accessible from a new <code>Developer Platform</code> tab on Account Home. See recently-modified projects and explore what you can work our developer-focused products.</p> </li> <li> <p><strong>Traffic and security insights</strong>: Get a snapshot of domain performance at a glance with key metrics and trends.</p> </li> <li> <p><strong>Quick actions</strong>: You can now perform common actions for your account, domains, and even Workers in just 1-2 clicks from the 3-dot menu.</p> </li> <li> <p><strong>Keep starred domains front and center</strong>: Now, when you filter for starred domains on Account Home, we'll save your preference so you'll continue to only see starred domains by default.</p> </li> </ul> <p>We can't wait for you to take the new Account Home for a spin.</p> <p>For more info:</p> <ul> <li><a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Try the updated Account Home<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/fundamentals/manage-domains/star-zones/">Documentation on starred domains</a></li> </ul>Wed, 26 Mar 2025 06:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsWorkers - Run Workers for up to 5 minutes of CPU-timehttps://developers.cloudflare.com/changelog/post/2025-03-25-higher-cpu-limits/https://developers.cloudflare.com/changelog/post/2025-03-25-higher-cpu-limits/ <p>You can now run a Worker for up to 5 minutes of CPU time for each request.</p> <p>Previously, each Workers request ran for a maximum of 30 seconds of CPU time — that is the time that a Worker is actually performing a task (we still allowed unlimited wall-clock time, in case you were waiting on slow resources). This meant that some compute-intensive tasks were impossible to do with a Worker. For instance, you might want to take the cryptographic hash of a large file from R2. If this computation ran for over 30 seconds, the Worker request would have timed out.</p> <p>By default, Workers are still limited to 30 seconds of CPU time. This protects developers from incurring accidental cost due to buggy code.</p> <p>By changing the <code>cpu_ms</code> value in your Wrangler configuration, you can opt in to any value up to 300,000 (5 minutes).</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...rest of your configuration...</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "limits"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cpu_ms"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">300000</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...rest of your configuration...</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">limits</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">cpu_ms = </span><span class="nb-shiki-dzsirb">300_000</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script><aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>CPU time is the amount of time the CPU actually spends doing work during a given request. If a Worker's request makes a sub-request and waits for that request to come back before doing additional work, this time spent waiting <strong>is not</strong> counted towards CPU time.</p><p>Worker requests could run for more than 30 seconds of total time prior to this change — only CPU time was limited.</p></div></div></aside> <p>For more information on the updates limits, see the documentation on <a href="https://developers.cloudflare.com/workers/wrangler/configuration/#limits">Wrangler configuration for <code>cpu_ms</code></a> and on <a href="https://developers.cloudflare.com/workers/platform/limits/#cpu-time">Workers CPU time limits</a>.</p> <p>For building long-running tasks on Cloudflare, we also recommend checking out <a href="https://developers.cloudflare.com/workflows/">Workflows</a> and <a href="https://developers.cloudflare.com/queues/">Queues</a>.</p>Wed, 26 Mar 2025 00:00:00 GMTWorkersWorkersWorkers - Source Maps are Generally Availablehttps://developers.cloudflare.com/changelog/post/2025-03-25-gzip-source-maps/https://developers.cloudflare.com/changelog/post/2025-03-25-gzip-source-maps/ <p>Source maps are now Generally Available (GA). You can now be uploaded with a maximum gzipped size of 15 MB. Previously, the maximum size limit was 15 MB uncompressed.</p> <p>Source maps help map between the original source code and the transformed/minified code that gets deployed to production. By uploading your source map, you allow Cloudflare to map the stack trace from exceptions onto the original source code making it easier to debug.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1908,height=198,format=webp/_astro/without-source-map.ByYR83oU.png" alt="Stack Trace without Source Map remapping" loading="lazy" decoding="async" width="1908" height="198"> <p>With <strong>no source maps uploaded</strong>: notice how all the Javascript has been minified to one file, so the stack trace is missing information on file name, shows incorrect line numbers, and incorrectly references <code>js</code> instead of <code>ts</code>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1850,height=238,format=webp/_astro/with-source-map.PipytmVe.png" alt="Stack Trace with Source Map remapping" loading="lazy" decoding="async" width="1850" height="238"> <p>With <strong>source maps uploaded</strong>: all methods reference the correct files and line numbers.</p> <p>Uploading source maps and stack trace remapping happens out of band from the Worker execution, so source maps do not affect upload speed, bundle size, or cold starts. The remapped stack traces are accessible through Tail Workers, Workers Logs, and Workers Logpush.</p> <p>To enable source maps, add the following to your <a href="https://developers.cloudflare.com/pages/functions/source-maps/">Pages Function's</a> or <a href="https://developers.cloudflare.com/workers/observability/source-maps/">Worker's</a> wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "upload_source_maps"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">upload_source_maps = </span><span class="nb-shiki-dzsirb">true</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script>Tue, 25 Mar 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-03-22 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-03-22-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-22-emergency-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="34583778093748cc83ff7b38f472013e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f472013e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100739</td><td>Next.js - Auth Bypass - CVE:CVE-2025-29927</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Sat, 22 Mar 2025 00:00:00 GMTWAFWAFWorkers, Pages, WAF - New Managed WAF rule for Next.js CVE-2025-29927.https://developers.cloudflare.com/changelog/post/2025-03-22-next-js-vulnerability-waf/https://developers.cloudflare.com/changelog/post/2025-03-22-next-js-vulnerability-waf/ <p><strong>Update: Mon Mar 24th, 11PM UTC</strong>: Next.js has made further changes to address a smaller vulnerability introduced in the patches made to its middleware handling. Users should upgrade to Next.js versions <code>15.2.4</code>, <code>14.2.26</code>, <code>13.5.10</code> or <code>12.3.6</code>. <strong>If you are unable to immediately upgrade or are running an older version of Next.js, you can enable the WAF rule described in this changelog as a mitigation</strong>.</p> <p><strong>Update: Mon Mar 24th, 8PM UTC</strong>: Next.js has now <a href="https://github.com/advisories/GHSA-f82v-jwr5-mffw" target="_blank" rel="noopener">backported the patch for this vulnerability<span class="external-link"> ↗</span></a> to cover Next.js v12 and v13. Users on those versions will need to patch to <code>13.5.9</code> and <code>12.3.5</code> (respectively) to mitigate the vulnerability.</p> <p><strong>Update: Sat Mar 22nd, 4PM UTC</strong>: We have changed this WAF rule to opt-in only, as sites that use auth middleware with third-party auth vendors were observing failing requests.</p> <p><strong>We strongly recommend updating your version of Next.js (if eligible)</strong> to the patched versions, as your app will otherwise be vulnerable to an authentication bypass attack regardless of auth provider.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="enable-the-managed-rule-strongly-recommended">Enable the Managed Rule (strongly recommended)</h4><a class="anchor-link" href="#enable-the-managed-rule-strongly-recommended"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>This rule is opt-in only for sites on the Pro plan or above in the <a href="https://developers.cloudflare.com/waf/managed-rules/">WAF managed ruleset</a>.</p> <p>To enable the rule:</p> <ol> <li>Head to Security &gt; WAF &gt; Managed rules in the Cloudflare dashboard for the zone (website) you want to protect.</li> <li>Click the three dots next to <strong>Cloudflare Managed Ruleset</strong> and choose <strong>Edit</strong></li> <li>Scroll down and choose <strong>Browse Rules</strong></li> <li>Search for <strong>CVE-2025-29927</strong> (ruleId: <code>34583778093748cc83ff7b38f472013e</code>)</li> <li>Change the <strong>Status</strong> to <strong>Enabled</strong> and the <strong>Action</strong> to <strong>Block</strong>. You can optionally set the rule to Log, to validate potential impact before enabling it. Log will not block requests.</li> <li>Click <strong>Next</strong></li> <li>Scroll down and choose <strong>Save</strong></li> </ol> <p>This will enable the WAF rule and block requests with the <code>x-middleware-subrequest</code> header regardless of Next.js version.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="create-a-waf-rule-manual">Create a WAF rule (manual)</h4><a class="anchor-link" href="#create-a-waf-rule-manual"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>For users on the Free plan, or who want to define a more specific rule, you can create a <a href="https://developers.cloudflare.com/waf/custom-rules/create-dashboard/">Custom WAF rule</a> to block requests with the <code>x-middleware-subrequest</code> header regardless of Next.js version.</p> <p>To create a custom rule:</p> <ol> <li>Head to Security &gt; WAF &gt; Custom rules in the Cloudflare dashboard for the zone (website) you want to protect.</li> <li>Give the rule a name - e.g. <code>next-js-CVE-2025-29927</code></li> <li>Set the matching parameters for the rule match any request where the <code>x-middleware-subrequest</code> header <code>exists</code> per the rule expression below.</li> </ol> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1t8gfj">len(http.request.headers[</span><span class="nb-shiki-1t8gfj">"x-middleware-subrequest"</span><span class="nb-shiki-1t8gfj">]</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-1t8gfj"> 0</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <ol start="4"> <li>Set the action to 'block'. If you want to observe the impact before blocking requests, set the action to 'log' (and edit the rule later).</li> <li><strong>Deploy</strong> the rule.</li> </ol> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2116,height=1148,format=webp/_astro/waf-rule-cve-2025-29927.0i0XiweZ.png" alt="Next.js CVE-2025-29927 WAF rule" loading="lazy" decoding="async" width="2116" height="1148"> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nextjs-cve-2025-29927">Next.js CVE-2025-29927</h4><a class="anchor-link" href="#nextjs-cve-2025-29927"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've made a WAF (Web Application Firewall) rule available to all sites on Cloudflare to protect against the <a href="https://github.com/advisories/GHSA-f82v-jwr5-mffw" target="_blank" rel="noopener">Next.js authentication bypass vulnerability<span class="external-link"> ↗</span></a> (<code>CVE-2025-29927</code>) published on March 21st, 2025.</p> <p><strong>Note</strong>: This rule is not enabled by default as it blocked requests across sites for specific authentication middleware.</p> <ul> <li>This managed rule protects sites using Next.js on Workers and Pages, as well as sites using Cloudflare to protect Next.js applications hosted elsewhere.</li> <li>This rule has been made available (but not enabled by default) to all sites as part of our <a href="https://developers.cloudflare.com/waf/managed-rules/reference/cloudflare-managed-ruleset/">WAF Managed Ruleset</a> and blocks requests that attempt to bypass authentication in Next.js applications.</li> <li>The vulnerability affects almost all Next.js versions, and has been fully patched in Next.js <code>14.2.26</code> and <code>15.2.4</code>. Earlier, interim releases did not fully patch this vulnerability.</li> <li><strong>Users on older versions of Next.js (<code>11.1.4</code> to <code>13.5.6</code>) did not originally have a patch available</strong>, but this the patch for this vulnerability and a subsequent additional patch have been backported to Next.js versions <code>12.3.6</code> and <code>13.5.10</code> as of Monday, March 24th. Users on Next.js v11 will need to deploy the stated workaround or enable the WAF rule.</li> </ul> <p>The managed WAF rule mitigates this by blocking <em>external</em> user requests with the <code>x-middleware-subrequest</code> header regardless of Next.js version, but we recommend users using Next.js 14 and 15 upgrade to the patched versions of Next.js as an additional mitigation.</p>Sat, 22 Mar 2025 00:00:00 GMTWorkersWorkersPagesWAFWorkers, Pages - Smart Placement is smarter about running Workers and Pages Functions in the best locationshttps://developers.cloudflare.com/changelog/post/2025-03-22-smart-placement-stablization/https://developers.cloudflare.com/changelog/post/2025-03-22-smart-placement-stablization/<p><a href="https://developers.cloudflare.com/workers/configuration/placement/">Smart Placement</a> is a unique Cloudflare feature that can make decisions to move your Worker to run in a more optimal location (such as closer to a database). Instead of always running in the default location (the one closest to where the request is received), Smart Placement uses certain “heuristics” (rules and thresholds) to decide if a different location might be faster or more efficient.</p> <p>Previously, if these heuristics weren't consistently met, your Worker would revert to running in the default location—even after it had been optimally placed. This meant that if your Worker received minimal traffic for a period of time, the system would reset to the default location, rather than remaining in the optimal one.</p> <p>Now, once Smart Placement has identified and assigned an optimal location, temporarily dropping below the heuristic thresholds will not force a return to default locations. For example in the previous algorithm, a drop in requests for a few days might return to default locations and heuristics would have to be met again. This was problematic for workloads that made requests to a geographically located resource every few days or longer. In this scenario, your Worker would never get placed optimally. This is no longer the case.</p>Sat, 22 Mar 2025 00:00:00 GMTWorkersWorkersPagesAI Gateway - AI Gateway launches Realtime WebSockets APIhttps://developers.cloudflare.com/changelog/post/2025-03-20-websockets/https://developers.cloudflare.com/changelog/post/2025-03-20-websockets/<p>We are excited to announce that <a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> now supports real-time AI interactions with the new <a href="https://developers.cloudflare.com/ai-gateway/usage/websockets-api/realtime-api/">Realtime WebSockets API</a>.</p> <p>This new capability allows developers to establish persistent, low-latency connections between their applications and AI models, enabling natural, real-time conversational AI experiences, including speech-to-speech interactions.</p> <p>The Realtime WebSockets API works with the <a href="https://platform.openai.com/docs/guides/realtime#connect-with-websockets" target="_blank" rel="noopener">OpenAI Realtime API<span class="external-link"> ↗</span></a>, <a href="https://ai.google.dev/gemini-api/docs/multimodal-live" target="_blank" rel="noopener">Google Gemini Live API<span class="external-link"> ↗</span></a>, and supports real-time text and speech interactions with models from <a href="https://docs.cartesia.ai/api-reference/tts/tts" target="_blank" rel="noopener">Cartesia<span class="external-link"> ↗</span></a>, and <a href="https://elevenlabs.io/docs/conversational-ai/api-reference/conversational-ai/websocket" target="_blank" rel="noopener">ElevenLabs<span class="external-link"> ↗</span></a>.</p> <p>Here's how you can connect AI Gateway to <a href="https://platform.openai.com/docs/guides/realtime#connect-with-websockets" target="_blank" rel="noopener">OpenAI's Realtime API<span class="external-link"> ↗</span></a> using WebSockets:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="javascript"><figcaption class="nb-code-title"><span class="nb-code-title-name">OpenAI Realtime API example</span><span class="nb-code-title-lang">javascript</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="javascript" data-nb-lang="javascript"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> WebSocket </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ws"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> url</span><span class="nb-shiki-1itgoe"> =</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "wss://gateway.ai.cloudflare.com/v1/&lt;account_id&gt;/&lt;gateway&gt;/openai?model=gpt-4o-realtime-preview-2024-12-17"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> ws</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> WebSocket</span><span class="nb-shiki-140thh">(url, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "cf-aig-authorization"</span><span class="nb-shiki-140thh">: process.env.</span><span class="nb-shiki-dzsirb">CLOUDFLARE_API_KEY</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> Authorization: </span><span class="nb-shiki-mdbnqw">"Bearer "</span><span class="nb-shiki-1itgoe"> +</span><span class="nb-shiki-140thh"> process.env.</span><span class="nb-shiki-dzsirb">OPENAI_API_KEY</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "OpenAI-Beta"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"realtime=v1"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"open"</span><span class="nb-shiki-140thh">, () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Connected to server."</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"message"</span><span class="nb-shiki-140thh">, (</span><span class="nb-shiki-1jdh33">message</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">parse</span><span class="nb-shiki-140thh">(message.</span><span class="nb-shiki-1t8gfj">toString</span><span class="nb-shiki-140thh">())));</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">ws.</span><span class="nb-shiki-1t8gfj">send</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-dzsirb"> JSON</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">stringify</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"response.create"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> response: { modalities: [</span><span class="nb-shiki-mdbnqw">"text"</span><span class="nb-shiki-140thh">], instructions: </span><span class="nb-shiki-mdbnqw">"Tell me a joke"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Get started by checking out the <a href="https://developers.cloudflare.com/ai-gateway/usage/websockets-api/realtime-api/">Realtime WebSockets API</a> documentation.</p>Fri, 21 Mar 2025 00:00:00 GMTAI GatewayAI GatewayGateway - Secure DNS Locations Management User Rolehttps://developers.cloudflare.com/changelog/post/2025-03-21-pdns-user-locations-role/https://developers.cloudflare.com/changelog/post/2025-03-21-pdns-user-locations-role/<p>We're excited to introduce the <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/dns/locations/#secure-dns-locations"><strong>Cloudflare Zero Trust Secure DNS Locations Write role</strong></a>, designed to provide DNS filtering customers with granular control over third-party access when configuring their Protective DNS (PDNS) solutions.</p> <p>Many DNS filtering customers rely on external service partners to manage their DNS location endpoints. This role allows you to grant access to external parties to administer DNS locations without overprovisioning their permissions.</p> <p><strong>Secure DNS Location Requirements:</strong></p> <ul> <li> <p>Mandate usage of <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/dns/locations/dns-resolver-ips/#bring-your-own-dns-resolver-ip" target="_blank" rel="noopener">Bring your own DNS resolver IP addresses<span class="external-link"> ↗</span></a> if available on the account.</p> </li> <li> <p>Require source network filtering for IPv4/IPv6/DoT endpoints; token authentication or source network filtering for the DoH endpoint.</p> </li> </ul> <p>You can assign the new role via Cloudflare Dashboard (<code>Manage Accounts &gt; Members</code>) or via API. For more information, refer to the <a href="https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/dns/locations/#secure-dns-locations" target="_blank" rel="noopener">Secure DNS Locations documentation<span class="external-link"> ↗</span></a>.</p>Fri, 21 Mar 2025 00:00:00 GMTGatewayGatewayCloudflare Fundamentals, Terraform - Dozens of Cloudflare Terraform Provider resources now have proper drift detectionhttps://developers.cloudflare.com/changelog/post/2025-03-21-resource-force-replacement-bug/https://developers.cloudflare.com/changelog/post/2025-03-21-resource-force-replacement-bug/<p>In <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">Cloudflare Terraform Provider<span class="external-link"> ↗</span></a> versions 5.2.0 and above, dozens of resources now have proper drift detection. Before this fix, these resources would indicate they needed to be updated or replaced — even if there was no real change. Now, you can rely on your <code>terraform plan</code> to only show what resources are expected to change.</p> <p>This issue affected <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">resources<span class="external-link"> ↗</span></a> related to these products and features:</p> <ul> <li>API Shield</li> <li>Argo Smart Routing</li> <li>Argo Tiered Caching</li> <li>Bot Management</li> <li>BYOIP</li> <li>D1</li> <li>DNS</li> <li>Email Routing</li> <li>Hyperdrive</li> <li>Observatory</li> <li>Pages</li> <li>R2</li> <li>Rules</li> <li>SSL/TLS</li> <li>Waiting Room</li> <li>Workers</li> <li>Zero Trust</li> </ul>Fri, 21 Mar 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformCloudflare Fundamentals, Terraform - Cloudflare Terraform Provider now properly redacts sensitive valueshttps://developers.cloudflare.com/changelog/post/2025-03-21-sensitive-values-redacted/https://developers.cloudflare.com/changelog/post/2025-03-21-sensitive-values-redacted/<p>In the <a href="https://github.com/cloudflare/terraform-provider-cloudflare" target="_blank" rel="noopener">Cloudflare Terraform Provider<span class="external-link"> ↗</span></a> versions 5.2.0 and above, sensitive properties of resources are redacted in logs. Sensitive properties in <a href="https://raw.githubusercontent.com/cloudflare/api-schemas/refs/heads/main/openapi.yaml" target="_blank" rel="noopener">Cloudflare's OpenAPI Schema<span class="external-link"> ↗</span></a> are now annotated with <code>x-sensitive: true</code>. This results in proper auto-generation of the corresponding Terraform resources, and prevents sensitive values from being shown when you run Terraform commands.</p> <p>This issue affected <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">resources<span class="external-link"> ↗</span></a> related to these products and features:</p> <ul> <li>Alerts and Audit Logs</li> <li>Device API</li> <li>DLP</li> <li>DNS</li> <li>Magic Visibility</li> <li>Magic WAN</li> <li>TLS Certs and Hostnames</li> <li>Tunnels</li> <li>Turnstile</li> <li>Workers</li> <li>Zaraz</li> </ul>Fri, 21 Mar 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers AI - Markdown conversion in Workers AIhttps://developers.cloudflare.com/changelog/post/2025-03-20-markdown-conversion/https://developers.cloudflare.com/changelog/post/2025-03-20-markdown-conversion/<p>Document conversion plays an important role when designing and developing AI applications and agents. Workers AI now provides the <code>toMarkdown</code> utility method that developers can use to for quick, easy, and convenient conversion and summary of documents in multiple formats to Markdown language.</p> <p>You can call this new tool using a binding by calling <code>env.AI.toMarkdown()</code> or the using the <a href="https://developers.cloudflare.com/api/resources/ai/">REST API</a> endpoint.</p> <p>In this example, we fetch a PDF document and an image from R2 and feed them both to <code>env.AI.toMarkdown()</code>. The result is a list of converted documents. Workers AI models are used automatically to detect and summarize the image.</p> <figure class="nb-code-figure" data-nb-lang="typescript"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="typescript" data-nb-lang="typescript"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./env"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ExecutionContext</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // https://pub-979cb28270cc461d94bc8a169d8f389d.r2.dev/somatosensory.pdf</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> pdf</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">R2</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"somatosensory.pdf"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // https://pub-979cb28270cc461d94bc8a169d8f389d.r2.dev/cat.jpeg</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> cat</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">R2</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"cat.jpeg"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">toMarkdown</span><span class="nb-shiki-140thh">([</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"somatosensory.pdf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> pdf.</span><span class="nb-shiki-1t8gfj">arrayBuffer</span><span class="nb-shiki-140thh">()], {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"application/octet-stream"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"cat.jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> blob: </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> Blob</span><span class="nb-shiki-140thh">([</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> cat.</span><span class="nb-shiki-1t8gfj">arrayBuffer</span><span class="nb-shiki-140thh">()], {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"application/octet-stream"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ]),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>This is the result:</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">[</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"somatosensory.pdf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mimeType"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"application/pdf"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "format"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"markdown"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tokens"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "data"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"# somatosensory.pdf</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">## Metadata</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- PDFFormatVersion=1.4</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- IsLinearized=false</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- IsAcroFormPresent=false</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- IsXFAPresent=false</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- IsCollectionPresent=false</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- IsSignaturesPresent=false</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- Producer=Prince 20150210 (www.princexml.com)</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">- Title=Anatomy of the Somatosensory System</span><span class="nb-shiki-dzsirb">\n\n</span><span class="nb-shiki-mdbnqw">## Contents</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">### Page 1</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">This is a sample document to showcase..."</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cat.jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "mimeType"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"image/jpeg"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "format"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"markdown"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tokens"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "data"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"The image is a close-up photograph of Grumpy Cat, a cat with a distinctive grumpy expression and piercing blue eyes. The cat has a brown face with a white stripe down its nose, and its ears are pointed upright. Its fur is light brown and darker around the face, with a pink nose and mouth. The cat's eyes are blue and slanted downward, giving it a perpetually grumpy appearance. The background is blurred, but it appears to be a dark brown color. Overall, the image is a humorous and iconic representation of the popular internet meme character, Grumpy Cat. The cat's facial expression and posture convey a sense of displeasure or annoyance, making it a relatable and entertaining image for many people."</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">]</span></span></code></pre></figure> <p>See <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Markdown Conversion</a> for more information on supported formats, REST API and pricing.</p>Thu, 20 Mar 2025 00:00:00 GMTWorkers AIWorkers AIWAF - WAF Release - 2025-03-19 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-03-19-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-19-emergency-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="470b477e27244fddb479c4c7a2cafae7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a2cafae7</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100736</td><td>Generic HTTP Request Smuggling</td><td>N/A</td><td>Disabled</td><td>This is a New Detection</td></tr></tbody></table>Wed, 19 Mar 2025 00:00:00 GMTWAFWAFAgents, Workers - npm i agentshttps://developers.cloudflare.com/changelog/post/2025-03-18-npm-i-agents/https://developers.cloudflare.com/changelog/post/2025-03-18-npm-i-agents/<img src="https://developers.cloudflare.com/_astro/npm-i-agents.CXCpJ1-7.apng" alt="npm i agents" loading="lazy" decoding="async" width="1000" height="541"><div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agents-sdk---agents"><code>agents-sdk</code> -&gt; <code>agents</code> <span class="inline-flex items-center rounded-full font-medium whitespace-nowrap bg-success-muted text-success px-2 py-0.5 text-xs">Updated</span></h4><a class="anchor-link" href="#agents-sdk---agents"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>📝 <strong>We've renamed the Agents package to <code>agents</code></strong>!</p> <p>If you've already been building with the Agents SDK, you can update your dependencies to use the new package name, and replace references to <code>agents-sdk</code> with <code>agents</code>:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Install the new package</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents</span></span></code></pre></figure> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Remove the old (deprecated) package</span></span> <span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> uninstall</span><span class="nb-shiki-mdbnqw"> agents-sdk</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"># Find instances of the old package name in your codebase</span></span> <span class="line"><span class="nb-shiki-1t8gfj">grep</span><span class="nb-shiki-dzsirb"> -r</span><span class="nb-shiki-mdbnqw"> 'agents-sdk'</span><span class="nb-shiki-mdbnqw"> .</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Replace instances of the old package name with the new one</span></span> <span class="line"><span class="nb-shiki-21nrsd"># (or use find-replace in your editor)</span></span> <span class="line"><span class="nb-shiki-1t8gfj">sed</span><span class="nb-shiki-dzsirb"> -i</span><span class="nb-shiki-mdbnqw"> 's/agents-sdk/agents/g'</span><span class="nb-shiki-140thh"> $(</span><span class="nb-shiki-1t8gfj">grep</span><span class="nb-shiki-dzsirb"> -rl</span><span class="nb-shiki-mdbnqw"> 'agents-sdk'</span><span class="nb-shiki-mdbnqw"> .</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <p>All future updates will be pushed to the new <code>agents</code> package, and the older package has been marked as deprecated.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agents-sdk-updates">Agents SDK updates <span class="inline-flex items-center rounded-full font-medium whitespace-nowrap bg-success-muted text-success px-2 py-0.5 text-xs">New</span></h4><a class="anchor-link" href="#agents-sdk-updates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've added a number of big new features to the Agents SDK over the past few weeks, including:</p> <ul> <li>You can now set <code>cors: true</code> when using <code>routeAgentRequest</code> to return permissive default CORS headers to Agent responses.</li> <li>The regular client now syncs state on the agent (just like the React version).</li> <li><code>useAgentChat</code> bug fixes for passing headers/credentials, including properly clearing cache on unmount.</li> <li>Experimental <code>/schedule</code> module with a prompt/schema for adding scheduling to your app (with evals!).</li> <li>Changed the internal <code>zod</code> schema to be compatible with the limitations of Google's Gemini models by removing the discriminated union, allowing you to use Gemini models with the scheduling API.</li> </ul> <p>We've also fixed a number of bugs with state synchronization and the React hooks.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// via https://github.com/cloudflare/agents/tree/main/examples/cross-domain</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set { cors: true } to enable CORS headers.</span></span> <span class="line"><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> routeAgentRequest</span><span class="nb-shiki-140thh">(request, env, { cors: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> })) </span><span class="nb-shiki-1itgoe">||</span></span> <span class="line"><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Not found"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">404</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// via https://github.com/cloudflare/agents/tree/main/examples/cross-domain</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set { cors: true } to enable CORS headers.</span></span> <span class="line"><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> routeAgentRequest</span><span class="nb-shiki-140thh">(request, env, { cors: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh"> })) </span><span class="nb-shiki-1itgoe">||</span></span> <span class="line"><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Not found"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">404</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div><div tabindex="-1" class="heading-wrapper level-h4"><h4 id="call-agent-methods-from-your-client-code">Call Agent methods from your client code <span class="inline-flex items-center rounded-full font-medium whitespace-nowrap bg-success-muted text-success px-2 py-0.5 text-xs">New</span></h4><a class="anchor-link" href="#call-agent-methods-from-your-client-code"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've added a new <a href="https://developers.cloudflare.com/agents/runtime/agents-api/"><code>@unstable_callable()</code></a> decorator for defining methods that can be called directly from clients. This allows you call methods from within your client code: you can call methods (with arguments) and get native JavaScript objects back.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// server.ts</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { unstable_callable, Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> Rpc</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Use the decorator to define a callable method</span></span> <span class="line"><span class="nb-shiki-140thh"> @</span><span class="nb-shiki-1t8gfj">unstable_callable</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"rpc test"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> getHistory</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">sql</span><span class="nb-shiki-mdbnqw">`SELECT * FROM history ORDER BY created_at DESC LIMIT 10`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-21nrsd">// server.ts</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { unstable_callable, Agent, </span><span class="nb-shiki-1itgoe">type</span><span class="nb-shiki-140thh"> StreamingResponse } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-1itgoe"> type</span><span class="nb-shiki-140thh"> { Env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "../server"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> Rpc</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Use the decorator to define a callable method</span></span> <span class="line"><span class="nb-shiki-140thh"> @</span><span class="nb-shiki-1t8gfj">unstable_callable</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"rpc test"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> getHistory</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">sql</span><span class="nb-shiki-mdbnqw">`SELECT * FROM history ORDER BY created_at DESC LIMIT 10`</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure><figure class="nb-code-figure" data-nb-lang="tsx"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tsx" data-nb-lang="tsx"><code><span class="line"><span class="nb-shiki-21nrsd">// client.tsx</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">call</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> useAgent</span><span class="nb-shiki-140thh">({ agent: </span><span class="nb-shiki-mdbnqw">"rpc"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-1t8gfj"> fetchUserHistory</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> setLoading</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call methods directly on the Agent!</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> result</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> call</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"getHistory"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> addToast</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`RPC result: ${</span><span class="nb-shiki-140thh">result</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"success"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">catch</span><span class="nb-shiki-140thh"> (error) {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> addToast</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`Error: ${</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"error"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> setLoading</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div></div><div tabindex="-1" class="heading-wrapper level-h4"><h4 id="agents-starter">agents-starter <span class="inline-flex items-center rounded-full font-medium whitespace-nowrap bg-success-muted text-success px-2 py-0.5 text-xs">Updated</span></h4><a class="anchor-link" href="#agents-starter"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've fixed a number of small bugs in the <a href="https://github.com/cloudflare/agents-starter" target="_blank" rel="noopener"><code>agents-starter</code><span class="external-link"> ↗</span></a> project — a real-time, chat-based example application with tool-calling &amp; human-in-the-loop built using the Agents SDK. The starter has also been upgraded to use the latest <a href="https://developers.cloudflare.com/changelog/2025-03-13-wrangler-v4/">wrangler v4</a> release.</p> <p>If you're new to Agents, you can install and run the <code>agents-starter</code> project in two commands:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-21nrsd"># Install it</span></span> <span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> npm</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> cloudflare@latest</span><span class="nb-shiki-mdbnqw"> agents-starter</span><span class="nb-shiki-dzsirb"> --</span><span class="nb-shiki-dzsirb"> --template=</span><span class="nb-shiki-mdbnqw">"cloudflare/agents-starter"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># Run it</span></span> <span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> npm</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> start</span></span></code></pre></figure> <p>You can use the starter as a template for your own Agents projects: open up <code>src/server.ts</code> and <code>src/client.tsx</code> to see how the Agents SDK is used.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="more-documentation">More documentation <span class="inline-flex items-center rounded-full font-medium whitespace-nowrap bg-success-muted text-success px-2 py-0.5 text-xs">Updated</span></h4><a class="anchor-link" href="#more-documentation"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>We've heard your feedback on the Agents SDK documentation, and we're shipping more API reference material and usage examples, including:</p> <ul> <li>Expanded <a href="https://developers.cloudflare.com/agents/runtime/">API reference documentation</a>, covering the methods and properties exposed by the Agents SDK, as well as more usage examples.</li> <li>More <a href="https://developers.cloudflare.com/agents/runtime/agents-api/#client-api">Client API</a> documentation that documents <code>useAgent</code>, <code>useAgentChat</code> and the new <code>@unstable_callable</code> RPC decorator exposed by the SDK.</li> <li>New documentation on how to <a href="https://developers.cloudflare.com/agents/runtime/communication/routing/">route requests to agents</a> and (optionally) authenticate clients before they connect to your Agents.</li> </ul> <p>Note that the Agents SDK is continually growing: the type definitions included in the SDK will always include the latest APIs exposed by the <code>agents</code> package.</p> <p>If you're still wondering what Agents are, <a href="https://blog.cloudflare.com/build-ai-agents-on-cloudflare/" target="_blank" rel="noopener">read our blog on building AI Agents on Cloudflare<span class="external-link"> ↗</span></a> and/or visit the <a href="https://developers.cloudflare.com/agents/">Agents documentation</a> to learn more.</p>Tue, 18 Mar 2025 00:00:00 GMTAgentsAgentsWorkersAPI Shield - New API Posture Management for API Shieldhttps://developers.cloudflare.com/changelog/post/2025-03-18-api-posture-management/https://developers.cloudflare.com/changelog/post/2025-03-18-api-posture-management/<p>Now, API Shield <strong>automatically</strong> labels your API inventory with API-specific risks so that you can track and manage risks to your APIs.</p> <p>View these risks in <a href="https://developers.cloudflare.com/api-shield/management-and-monitoring/">Endpoint Management</a> by label:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2172,height=936,format=webp/_astro/endpoint-management-label.BDmf8Ai1.png" alt="A list of endpoint management labels" loading="lazy" decoding="async" width="2172" height="936"> <p>...or in <a href="https://developers.cloudflare.com/security/security-insights/">Security Center Insights</a>:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2250,height=1316,format=webp/_astro/posture-management-insight.7vB7mzGI.png" alt="An example security center insight" loading="lazy" decoding="async" width="2250" height="1316"> <p>API Shield will scan for risks on your API inventory daily. Here are the new risks we're scanning for and automatically labelling:</p> <ul> <li><strong>cf-risk-sensitive</strong>: applied if the customer is subscribed to the <a href="https://developers.cloudflare.com/waf/managed-rules/reference/sensitive-data-detection/">sensitive data detection ruleset</a> and the WAF detects sensitive data returned on an endpoint in the last seven days.</li> <li><strong>cf-risk-missing-auth</strong>: applied if the customer has configured a session ID and no successful requests to the endpoint contain the session ID.</li> <li><strong>cf-risk-mixed-auth</strong>: applied if the customer has configured a session ID and some successful requests to the endpoint contain the session ID while some lack the session ID.</li> <li><strong>cf-risk-missing-schema</strong>: added when a learned schema is available for an endpoint that has no active schema.</li> <li><strong>cf-risk-error-anomaly</strong>: added when an endpoint experiences a recent increase in response errors over the last 24 hours.</li> <li><strong>cf-risk-latency-anomaly</strong>: added when an endpoint experiences a recent increase in response latency over the last 24 hours.</li> <li><strong>cf-risk-size-anomaly</strong>: added when an endpoint experiences a spike in response body size over the last 24 hours.</li> </ul> <p>In addition, API Shield has two new 'beta' scans for <strong>Broken Object Level Authorization (BOLA) attacks</strong>. If you're in the beta, you will see the following two labels when API Shield suspects an endpoint is suffering from a BOLA vulnerability:</p> <ul> <li><strong>cf-risk-bola-enumeration</strong>: added when an endpoint experiences successful responses with drastic differences in the number of unique elements requested by different user sessions.</li> <li><strong>cf-risk-bola-pollution</strong>: added when an endpoint experiences successful responses where parameters are found in multiple places in the request.</li> </ul> <p>We are currently accepting more customers into our beta. Contact your account team if you are interested in BOLA attack detection for your API.</p> <p>Refer to the <a href="https://blog.cloudflare.com/cloudflare-security-posture-management/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a> for more information about Cloudflare's expanded posture management capabilities.</p>Tue, 18 Mar 2025 00:00:00 GMTAPI ShieldAPI ShieldRadar - Leaked Credentials Insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-03-18-radar-leaked-credentials-insights/https://developers.cloudflare.com/changelog/post/2025-03-18-radar-leaked-credentials-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> has expanded its security insights, providing visibility into aggregate trends in authentication requests, including the detection of leaked credentials through <a href="https://developers.cloudflare.com/waf/detections/leaked-credentials/">leaked credentials detection</a> scans.</p> <p>We have now introduced the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/leaked_credentials/subresources/summary/"><code>/leaked_credential_checks/summary/{dimension}</code></a>: Retrieves summaries of HTTP authentication requests distribution across two different dimensions.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/leaked_credentials/subresources/timeseries_groups/"><code>/leaked_credential_checks/timeseries_groups/{dimension}</code></a>: Retrieves timeseries data for HTTP authentication requests distribution across two different dimensions.</li> </ul> <p>The following dimensions are available, displaying the distribution of HTTP authentication requests based on:</p> <ul> <li><code>compromised</code>: Credential status (clean vs. compromised).</li> <li><code>bot_class</code>: <a href="https://developers.cloudflare.com/radar/concepts/bot-classes">Bot class</a> (human vs. bot).</li> </ul> <p>Dive deeper into leaked credential detection in this <a href="https://blog.cloudflare.com/password-reuse-rampant-half-user-logins-compromised/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a> and learn more about the expanded Radar security insights in our <a href="https://blog.cloudflare.com/cloudflare-radar-ddos-leaked-credentials-bots" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Tue, 18 Mar 2025 00:00:00 GMTRadarRadarCloudflare One Client - Cloudflare One Agent for Android (version 2.4)https://developers.cloudflare.com/changelog/post/2025-03-17-warp-ga-android/https://developers.cloudflare.com/changelog/post/2025-03-17-warp-ga-android/<p>A new GA release for the Android Cloudflare One Agent is now available in the <a href="https://play.google.com/store/apps/details?id=com.cloudflare.cloudflareoneagent" target="_blank" rel="noopener">Google Play Store<span class="external-link"> ↗</span></a>. This release includes a new feature allowing <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/manual-deployment/#enroll-using-a-url">team name insertion by URL</a> during enrollment, as well as fixes and minor improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improved in-app error messages.</li> <li>Improved mobile client login with support for <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/manual-deployment/#enroll-using-a-url">team name insertion by URL</a>.</li> <li>Fixed an issue preventing admin split tunnel settings taking priority for traffic from certain applications.</li> </ul>Mon, 17 Mar 2025 00:00:00 GMTCloudflare One ClientCloudflare One ClientCloudflare One Client - Cloudflare One Agent for iOS (version 1.10)https://developers.cloudflare.com/changelog/post/2025-03-17-warp-ga-ios/https://developers.cloudflare.com/changelog/post/2025-03-17-warp-ga-ios/<p>A new GA release for the iOS Cloudflare One Agent is now available in the <a href="https://apps.apple.com/us/app/cloudflare-one-agent/id6443476492" target="_blank" rel="noopener">iOS App Store<span class="external-link"> ↗</span></a>. This release includes a new feature allowing <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/manual-deployment/#enroll-using-a-url">team name insertion by URL</a> during enrollment, as well as fixes and minor improvements.</p> <p><strong>Changes and improvements</strong></p> <ul> <li>Improved in-app error messages.</li> <li>Improved mobile client login with support for <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/manual-deployment/#enroll-using-a-url">team name insertion by URL</a>.</li> <li>Bug fixes and performance improvements.</li> </ul>Mon, 17 Mar 2025 00:00:00 GMTCloudflare One ClientCloudflare One ClientWAF - WAF Release - 2025-03-17https://developers.cloudflare.com/changelog/post/2025-03-17-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-17-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="28b2a12993a04e62a98abcd9e59ec18a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e59ec18a</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100725</td><td><p>Fortinet FortiManager - Remote Code Execution - CVE:CVE-2023-42791, CVE:CVE-2024-23666</p></td><td>Log</td><td>Block</td><td></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f253d755910e4998bd90365d1dbf58df"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1dbf58df</span></button></rule-id></td><td>100726</td><td>Ivanti - Remote Code Execution - CVE:CVE-2024-8190</td><td>Log</td><td>Block</td><td></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="19ae0094a8d845a1bb1997af0ad61fa7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0ad61fa7</span></button></rule-id></td><td>100727</td><td>Cisco IOS XE - Remote Code Execution - CVE:CVE-2023-20198</td><td>Log</td><td>Disabled</td><td>Fixed action value in changelog; no rule changes.</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="83a677f082264693ad64a2827ee56b66"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7ee56b66</span></button></rule-id></td><td>100728</td><td>Sitecore - Remote Code Execution - CVE:CVE-2024-46938</td><td>Log</td><td>Block</td><td></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="166b7ce85ce443538f021228a6752a38"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a6752a38</span></button></rule-id></td><td>100729</td><td>Microsoft SharePoint - Remote Code Execution - CVE:CVE-2023-33160</td><td>Log</td><td>Block</td><td></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="35fe23e7bd324d00816c82d098d47b69"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...98d47b69</span></button></rule-id></td><td>100730</td><td><p>Pentaho - Template Injection - CVE:CVE-2022-43769, CVE:CVE-2022-43939</p></td><td>Log</td><td>Block</td><td></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2ce80fe815254f25b3c8f47569fe1e0d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...69fe1e0d</span></button></rule-id></td><td>100700</td><td>Apache SSRF vulnerability CVE-2021-40438</td><td>N/A</td><td>Block</td><td></td></tr></tbody></table>Mon, 17 Mar 2025 00:00:00 GMTWAFWAFWorkers AI - New models in Workers AIhttps://developers.cloudflare.com/changelog/post/2025-03-17-new-workers-ai-models/https://developers.cloudflare.com/changelog/post/2025-03-17-new-workers-ai-models/<p>Workers AI is excited to add 4 new models to the catalog, including 2 brand new classes of models with a text-to-speech and reranker model. Introducing:</p> <ul> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-m3/">@cf/baai/bge-m3</a> - a multi-lingual embeddings model that supports over 100 languages. It can also simultaneously perform dense retrieval, multi-vector retrieval, and sparse retrieval, with the ability to process inputs of different granularities.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/bge-reranker-base/">@cf/baai/bge-reranker-base</a> - our first reranker model! Rerankers are a type of text classification model that takes a query and context, and outputs a similarity score between the two. When used in RAG systems, you can use a reranker after the initial vector search to find the most relevant documents to return to a user by reranking the outputs.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/whisper-large-v3-turbo/">@cf/openai/whisper-large-v3-turbo</a> - a faster, more accurate speech-to-text model. This model was added earlier but is graduating out of beta with pricing included today.</li> <li><a href="https://developers.cloudflare.com/workers-ai/models/melotts/">@cf/myshell-ai/melotts</a> - our first text-to-speech model that allows users to generate an MP3 with voice audio from inputted text.</li> </ul> <p>Pricing is available for each of these models on the <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">Workers AI pricing page</a>.</p> <p>This docs update includes a few minor bug fixes to the model schema for llama-guard, llama-3.2-1b, which you can review on the <a href="https://developers.cloudflare.com/workers-ai/changelog/">product changelog</a>.</p> <p>Try it out and let us know what you think! Stay tuned for more models in the coming days.</p>Mon, 17 Mar 2025 00:00:00 GMTWorkers AIWorkers AIWorkers - Import `env` to access bindings in your Worker's global scopehttps://developers.cloudflare.com/changelog/post/2025-03-17-importable-env/https://developers.cloudflare.com/changelog/post/2025-03-17-importable-env/ <p>You can now access <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">bindings</a> from anywhere in your Worker by importing the <code>env</code> object from <code>cloudflare:workers</code>.</p> <p>Previously, <code>env</code> could only be accessed during a request. This meant that bindings could not be used in the top-level context of a Worker.</p> <p>Now, you can import <code>env</code> and access bindings such as <a href="https://developers.cloudflare.com/workers/configuration/secrets/">secrets</a> or <a href="https://developers.cloudflare.com/workers/configuration/environment-variables/">environment variables</a> in the initial setup for your Worker:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> ApiClient </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "example-api-client"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// API_KEY and LOG_LEVEL now usable in top-level scope</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> apiClient</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> ApiClient.</span><span class="nb-shiki-1t8gfj">new</span><span class="nb-shiki-140thh">({ apiKey: env.</span><span class="nb-shiki-dzsirb">API_KEY</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> LOG_LEVEL</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">LOG_LEVEL</span><span class="nb-shiki-1itgoe"> ||</span><span class="nb-shiki-mdbnqw"> "info"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // you can use apiClient or LOG_LEVEL, configured before any request is handled</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Workers do not allow I/O from outside a request context. This means that even though <code>env</code> is accessible from the top-level scope, you will not be able to access every binding's methods.</p><p>For instance, environment variables and secrets are accessible, and you are able to call <code>env.NAMESPACE.get</code> to get a <a href="https://developers.cloudflare.com/durable-objects/api/stub/">Durable Object stub</a> in the top-level context. However, calling methods on the Durable Object stub, making <a href="https://developers.cloudflare.com/kv/api/">calls to a KV store</a>, and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings">calling to other Workers</a> will not work.</p></div></div></aside> <p>Additionally, <code>env</code> was normally accessed as a argument to a Worker's entrypoint handler, such as <a href="https://developers.cloudflare.com/workers/runtime-apis/fetch/"><code>fetch</code></a>. This meant that if you needed to access a binding from a deeply nested function, you had to pass <code>env</code> as an argument through many functions to get it to the right spot. This could be cumbersome in complex codebases.</p> <p>Now, you can access the bindings from anywhere in your codebase without passing <code>env</code> as an argument:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-21nrsd">// helpers.js</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { env } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// env is *not* an argument to this function</span></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1itgoe"> function</span><span class="nb-shiki-1t8gfj"> getValue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">key</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> prefix </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">KV_PREFIX</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">`${</span><span class="nb-shiki-140thh">prefix</span><span class="nb-shiki-mdbnqw">}-${</span><span class="nb-shiki-140thh">key</span><span class="nb-shiki-mdbnqw">}`</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more information, see <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings#how-to-access-env">documentation on accessing <code>env</code></a>.</p>Mon, 17 Mar 2025 00:00:00 GMTWorkersWorkersWorkers, Pages - Retry Pages & Workers Builds Directly from GitHubhttps://developers.cloudflare.com/changelog/post/2025-03-17-rerun-build/https://developers.cloudflare.com/changelog/post/2025-03-17-rerun-build/<p>You can now retry your Cloudflare Pages and Workers builds directly from GitHub. No need to switch to the Cloudflare Dashboard for a simple retry!</p> <p>Let\u2019s say you push a commit, but your build fails due to a spurious error like a network timeout. Instead of going to the Cloudflare Dashboard to manually retry, you can now rerun the build with just a few clicks inside GitHub, keeping you inside your workflow.</p> <p>For Pages and Workers projects connected to a GitHub repository:</p> <ol> <li>When a build fails, go to your GitHub repository or pull request</li> <li>Select the failed Check Run for the build</li> <li>Select "Details" on the Check Run</li> <li>Select "Rerun" to trigger a retry build for that commit</li> </ol> <p>Learn more about <a href="https://developers.cloudflare.com/pages/configuration/git-integration/github-integration/">Pages Builds</a> and <a href="https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/github-integration/">Workers Builds</a>.</p>Mon, 17 Mar 2025 00:00:00 GMTWorkersWorkersPagesCloudflare Network Firewall - Cloudflare IP Ranges Listhttps://developers.cloudflare.com/changelog/post/2025-03-13-new-managed-iplist/https://developers.cloudflare.com/changelog/post/2025-03-13-new-managed-iplist/<p>Magic Firewall now supports a new managed list of Cloudflare IP ranges. This list is available as an option when creating a Magic Firewall policy based on IP source/destination addresses. When selecting "is in list" or "is not in list", the option "<strong>Cloudflare IP Ranges</strong>" will appear in the dropdown menu.</p> <p>This list is based on the IPs listed in the Cloudflare <a href="https://www.cloudflare.com/en-gb/ips/" target="_blank" rel="noopener">IP ranges<span class="external-link"> ↗</span></a>. Updates to this managed list are applied automatically.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1102,height=677,format=webp/_astro/cloudflare-ips.DetyOndL.png" alt="Cloudflare IPs Managed List" loading="lazy" decoding="async" width="1102" height="677"> <p>Note: IP Lists require a Cloudflare Advanced Network Firewall subscription. For more details about Cloudflare Network Firewall plans, refer to <a href="https://developers.cloudflare.com/cloudflare-network-firewall/plans">Plans</a>.</p>Thu, 13 Mar 2025 00:00:00 GMTCloudflare Network FirewallCloudflare Network FirewallWorkers - Use the latest JavaScript features with Wrangler CLI v4https://developers.cloudflare.com/changelog/post/2025-03-13-wrangler-v4/https://developers.cloudflare.com/changelog/post/2025-03-13-wrangler-v4/ <p>We've released the next major version of <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, the CLI for Cloudflare Workers — <code>wrangler@4.0.0</code>. Wrangler v4 is a major release focused on updates to underlying systems and dependencies, along with improvements to keep Wrangler commands consistent and clear.</p> <p>You can run the following command to install it in your projects:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-npm" id="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-yarn" id="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-pnpm" id="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-bun" id="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-npm" aria-labelledby="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i wrangler@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i wrangler@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-yarn" aria-labelledby="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add wrangler@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add wrangler@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-pnpm" aria-labelledby="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add wrangler@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add wrangler@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-bun" aria-labelledby="pm-tab-pm-d1bf24b0-5e79-4a25-a793-cc02f9be1547-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add wrangler@latest</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add wrangler@latest" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Unlike previous major versions of Wrangler, which were <a href="https://blog.cloudflare.com/wrangler-v2-beta/" target="_blank" rel="noopener">foundational rewrites<span class="external-link"> ↗</span></a> and <a href="https://blog.cloudflare.com/wrangler3/" target="_blank" rel="noopener">rearchitectures<span class="external-link"> ↗</span></a> — Version 4 of Wrangler includes a much smaller set of changes. If you use Wrangler today, your workflow is very unlikely to change.</p> <p>A <a href="https://developers.cloudflare.com/workers/wrangler/migration/update-v3-to-v4">detailed migration guide</a> is available and if you find a bug or hit a roadblock when upgrading to Wrangler v4, <a href="https://github.com/cloudflare/workers-sdk/issues/new?template=bug-template.yaml" target="_blank" rel="noopener">open an issue on the <code>cloudflare/workers-sdk</code> repository on GitHub<span class="external-link"> ↗</span></a>.</p> <p>Going forward, we'll continue supporting Wrangler v3 with bug fixes and security updates until Q1 2026, and with critical security updates until Q1 2027, at which point it will be out of support.</p>Thu, 13 Mar 2025 00:00:00 GMTWorkersWorkersWorkers - Set breakpoints and debug your Workers tests with @cloudflare/vitest-pool-workershttps://developers.cloudflare.com/changelog/post/2025-03-14-breakpoint-debugging-with-vitest/https://developers.cloudflare.com/changelog/post/2025-03-14-breakpoint-debugging-with-vitest/<p>You can now debug your Workers tests with our <a href="https://developers.cloudflare.com/workers/testing/vitest-integration/">Vitest integration</a> by running the following command:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">vitest</span><span class="nb-shiki-dzsirb"> --inspect</span><span class="nb-shiki-dzsirb"> --no-file-parallelism</span></span></code></pre></figure> <p>Attach a debugger to the port 9229 and you can start stepping through your Workers tests. This is available with <code>@cloudflare/vitest-pool-workers</code> v0.7.5 or later.</p> <p>Learn more in our <a href="https://developers.cloudflare.com/workers/testing/vitest-integration/debugging/">documentation</a>.</p>Thu, 13 Mar 2025 00:00:00 GMTWorkersWorkersEmail Service - Threaded replies now possible in Email Workershttps://developers.cloudflare.com/changelog/post/2025-03-12-reply-limits/https://developers.cloudflare.com/changelog/post/2025-03-12-reply-limits/<p>We’re removing some of the restrictions in Email Routing so that AI Agents and task automation can better handle email workflows, including how Workers can <a href="https://developers.cloudflare.com/email-service/api/route-emails/email-handler/#reply-to-emails">reply</a> to incoming emails.</p> <p>It's now possible to keep a threaded email conversation with an <a href="https://developers.cloudflare.com/email-service/api/route-emails/email-handler/">Email Worker</a> script as long as:</p> <ul> <li>The incoming email has to have valid <a href="https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/" target="_blank" rel="noopener">DMARC<span class="external-link"> ↗</span></a>.</li> <li>The email can only be replied to once in the same <code>EmailMessage</code> event.</li> <li>The recipient in the reply must match the incoming sender.</li> <li>The outgoing sender domain must match the same domain that received the email.</li> <li>Every time an email passes through Email Routing or another MTA, an entry is added to the <code>References</code> list. We stop accepting replies to emails with more than 100 <code>References</code> entries to prevent abuse or accidental loops.</li> </ul> <p>Here's an example of a Worker responding to Emails using a Workers AI model:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">AI model responding to emails</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> PostalMime </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "postal-mime"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createMimeMessage } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "mimetext"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { EmailMessage } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:email"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> email</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">message</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> email</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> PostalMime.</span><span class="nb-shiki-1t8gfj">parse</span><span class="nb-shiki-140thh">(message.raw);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> res</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">run</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"@cf/meta/llama-2-7b-chat-fp16"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content: email.text </span><span class="nb-shiki-1itgoe">??</span><span class="nb-shiki-mdbnqw"> ""</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // message-id is generated by mimetext</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createMimeMessage</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">setHeader</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"In-Reply-To"</span><span class="nb-shiki-140thh">, message.headers.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Message-ID"</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">setSender</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"agent@example.com"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">setRecipient</span><span class="nb-shiki-140thh">(message.from);</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">setSubject</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Llama response"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">addMessage</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> contentType: </span><span class="nb-shiki-mdbnqw">"text/plain"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> data:</span></span> <span class="line"><span class="nb-shiki-140thh"> res </span><span class="nb-shiki-1itgoe">instanceof</span><span class="nb-shiki-1t8gfj"> ReadableStream</span></span> <span class="line"><span class="nb-shiki-1itgoe"> ?</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(res).</span><span class="nb-shiki-1t8gfj">text</span><span class="nb-shiki-140thh">()</span></span> <span class="line"><span class="nb-shiki-1itgoe"> :</span><span class="nb-shiki-140thh"> res.response</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> replyMessage</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> EmailMessage</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "&lt;email&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> message.from,</span></span> <span class="line"><span class="nb-shiki-140thh"> response.</span><span class="nb-shiki-1t8gfj">asRaw</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> message.</span><span class="nb-shiki-1t8gfj">reply</span><span class="nb-shiki-140thh">(replyMessage);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt;;</span></span></code></pre></figure> <p>See <a href="https://developers.cloudflare.com/email-service/api/route-emails/email-handler/#reply-to-emails">Reply to emails from Workers</a> for more information.</p>Wed, 12 Mar 2025 00:00:00 GMTEmail ServiceEmail ServiceWAF - WAF Release - 2025-03-11 - Emergencyhttps://developers.cloudflare.com/changelog/post/2025-03-11-emergency-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-11-emergency-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="0823d16dd8b94cc6b27a9ab173febb31"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...73febb31</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100731</td><td>Apache Camel - Code Injection - CVE:CVE-2025-27636</td><td>N/A</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Tue, 11 Mar 2025 00:00:00 GMTWAFWAFWorkers - Access your Worker's environment variables from process.envhttps://developers.cloudflare.com/changelog/post/2025-03-11-process-env-support/https://developers.cloudflare.com/changelog/post/2025-03-11-process-env-support/ <p>You can now access <a href="https://developers.cloudflare.com/workers/configuration/environment-variables/">environment variables</a> and <a href="https://developers.cloudflare.com/workers/configuration/secrets/">secrets</a> on <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/process/#processenv"><code>process.env</code></a> when using the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag"><code>nodejs_compat</code> compatibility flag</a>.</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> apiClient</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> ApiClient.</span><span class="nb-shiki-1t8gfj">new</span><span class="nb-shiki-140thh">({ apiKey: process.env.</span><span class="nb-shiki-dzsirb">API_KEY</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> LOG_LEVEL</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> process.env.</span><span class="nb-shiki-dzsirb">LOG_LEVEL</span><span class="nb-shiki-1itgoe"> ||</span><span class="nb-shiki-mdbnqw"> "info"</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure> <p>In Node.js, environment variables are exposed via the global <code>process.env</code> object. Some libraries assume that this object will be populated, and many developers may be used to accessing variables in this way.</p> <p>Previously, the <code>process.env</code> object was always empty unless written to in Worker code. This could cause unexpected errors or friction when developing Workers using code previously written for Node.js.</p> <p>Now, <a href="https://developers.cloudflare.com/workers/configuration/environment-variables/">environment variables</a>, <a href="https://developers.cloudflare.com/workers/configuration/secrets/">secrets</a>, and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/version-metadata/">version metadata</a> can all be accessed on <code>process.env</code>.</p> <p>To opt-in to the new <code>process.env</code> behaviour now, add the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-auto-populating-processenv"><code>nodejs_compat_populate_process_env</code></a> compatibility flag to your <code>wrangler.json</code> configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Rest of your configuration</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Add "nodejs_compat_populate_process_env" to your compatibility_flags array</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "compatibility_flags"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"nodejs_compat_populate_process_env"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Rest of your configuration</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">compatibility_flags = [ </span><span class="nb-shiki-mdbnqw">"nodejs_compat"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"nodejs_compat_populate_process_env"</span><span class="nb-shiki-140thh"> ]</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>After April 1, 2025, populating <code>process.env</code> will become the default behavior when both <code>nodejs_compat</code> is enabled and your Worker's <code>compatibility_date</code> is after "2025-04-01".</p>Tue, 11 Mar 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-03-10https://developers.cloudflare.com/changelog/post/2025-03-10-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-10-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d4f68c1c65c448e58fe4830eb2a51e3d"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b2a51e3d</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100722</td><td>Ivanti - Information Disclosure - CVE:CVE-2025-0282</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fda130e396224ffc9f0a9e72259073d5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...259073d5</span></button></rule-id></td><td>100723</td><td>Cisco IOS XE - Information Disclosure - CVE:CVE-2023-20198</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 10 Mar 2025 00:00:00 GMTWAFWAFDigital Experience Monitoring - Cloudflare One Agent now supports Endpoint Monitoringhttps://developers.cloudflare.com/changelog/post/2025-03-07-cloudflare-one-device-health-monitoring/https://developers.cloudflare.com/changelog/post/2025-03-07-cloudflare-one-device-health-monitoring/<p><a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">Digital Experience Monitoring (DEX)</a> provides visibility into device, network, and application performance across your Cloudflare SASE deployment. The latest release of the Cloudflare One agent (v2025.1.861) now includes device endpoint monitoring capabilities to provide deeper visibility into end-user device performance which can be analyzed directly from the dashboard.</p> <p>Device health metrics are now automatically collected, allowing administrators to:</p> <ul> <li>View the last network a user was connected to</li> <li>Monitor CPU and RAM utilization on devices</li> <li>Identify resource-intensive processes running on endpoints</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1226,height=675,format=webp/_astro/cloudflare-one-agent-health-monitoring.XXtiRuOp.gif" alt="Device endpoint monitoring dashboard" loading="lazy" decoding="async" width="1226" height="675"> <p>This feature complements existing DEX features like <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/tests/">synthetic application monitoring</a> and <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/tests/traceroute/">network path visualization</a>, creating a comprehensive troubleshooting workflow that connects application performance with device state.</p> <p>For more details refer to our <a href="https://developers.cloudflare.com/cloudflare-one/insights/dex/">DEX</a> documentation.</p>Fri, 07 Mar 2025 00:00:00 GMTDigital Experience MonitoringDigital Experience MonitoringHyperdrive - Hyperdrive reduces query latency by up to 90% and now supports IP access control listshttps://developers.cloudflare.com/changelog/post/2025-03-04-hyperdrive-pooling-near-database-and-ip-range-egress/https://developers.cloudflare.com/changelog/post/2025-03-04-hyperdrive-pooling-near-database-and-ip-range-egress/<p>Hyperdrive now pools database connections in one or more regions close to your database. This means that your uncached queries and new database connections have up to 90% less latency as measured from connection pools.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1732,height=836,format=webp/_astro/hyperdrive-regional-pooling-query-latency-improvement.Bzz_xvHZ.png" alt="Hyperdrive query latency decreases by 90% during Hyperdrive's gradual rollout of regional pooling." loading="lazy" decoding="async" width="1732" height="836"> <p>By improving placement of Hyperdrive database connection pools, Workers' Smart Placement is now more effective when used with Hyperdrive, ensuring that your Worker can be placed as close to your database as possible.</p> <p>With this update, Hyperdrive also uses <a href="https://www.cloudflare.com/ips/" target="_blank" rel="noopener">Cloudflare's standard IP address ranges<span class="external-link"> ↗</span></a> to connect to your database. This enables you to configure the firewall policies (IP access control lists) of your database to only allow access from Cloudflare and Hyperdrive.</p> <p>Refer to <a href="https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/">documentation on how Hyperdrive makes connecting to regional databases from Cloudflare Workers fast</a>.</p> <p>This improvement is enabled on all Hyperdrive configurations.</p>Fri, 07 Mar 2025 00:00:00 GMTHyperdriveHyperdriveWAF - Updated leaked credentials databasehttps://developers.cloudflare.com/changelog/post/2025-03-07-updated-leaked-credentials-database/https://developers.cloudflare.com/changelog/post/2025-03-07-updated-leaked-credentials-database/<p>Added new records to the leaked credentials database. The record sources are: Have I Been Pwned (HIBP) database, RockYou 2024 dataset, and another third-party database.</p>Fri, 07 Mar 2025 00:00:00 GMTWAFWAFLogs - One-click Logpush Setup with R2 Object Storagehttps://developers.cloudflare.com/changelog/post/2025-03-06-oneclick-logpush/https://developers.cloudflare.com/changelog/post/2025-03-06-oneclick-logpush/<p>We’ve streamlined the <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a> setup process by integrating R2 bucket creation directly into the Logpush workflow!</p> <p>Now, you no longer need to navigate multiple pages to manually create an R2 bucket or copy credentials. With this update, you can seamlessly <strong>configure a Logpush job to R2 in just one click</strong>, reducing friction and making setup faster and easier.</p> <p>This enhancement makes it easier for customers to adopt Logpush and R2.</p> <p>For more details refer to our <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/r2/">Logs</a> documentation.</p>Thu, 06 Mar 2025 00:00:00 GMTLogsLogsR2 - Set retention polices for your R2 bucket with bucket lockshttps://developers.cloudflare.com/changelog/post/2025-03-06-r2-bucket-locks/https://developers.cloudflare.com/changelog/post/2025-03-06-r2-bucket-locks/<p>You can now use <a href="https://developers.cloudflare.com/r2/buckets/bucket-locks/">bucket locks</a> to set retention policies on your <a href="https://developers.cloudflare.com/r2/buckets/">R2 buckets</a> (or specific prefixes within your buckets) for a specified period — or indefinitely. This can help ensure compliance by protecting important data from accidental or malicious deletion.</p> <p>Locks give you a few ways to ensure your objects are retained (not deleted or overwritten). You can:</p> <ul> <li>Lock objects for a specific duration, for example 90 days.</li> <li>Lock objects until a certain date, for example January 1, 2030.</li> <li>Lock objects indefinitely, until the lock is explicitly removed.</li> </ul> <p>Buckets can have up to 1,000 <a href="https://developers.cloudflare.com/r2/buckets/">bucket lock rules</a>. Each rule specifies which objects it covers (via prefix) and how long those objects must remain retained.</p> <p>Here are a couple of examples showing how you can configure bucket lock rules using <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>:</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="ensure-all-objects-in-a-bucket-are-retained-for-at-least-180-days">Ensure all objects in a bucket are retained for at least 180 days</h4><a class="anchor-link" href="#ensure-all-objects-in-a-bucket-are-retained-for-at-least-180-days"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> lock</span><span class="nb-shiki-mdbnqw"> add</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">bucke</span><span class="nb-shiki-140thh">t</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> 180-days-all</span><span class="nb-shiki-dzsirb"> --retention-days</span><span class="nb-shiki-dzsirb"> 180</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="prevent-deletion-or-overwriting-of-all-logs-indefinitely-via-prefix">Prevent deletion or overwriting of all logs indefinitely (via prefix)</h4><a class="anchor-link" href="#prevent-deletion-or-overwriting-of-all-logs-indefinitely-via-prefix"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npx</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> r2</span><span class="nb-shiki-mdbnqw"> bucket</span><span class="nb-shiki-mdbnqw"> lock</span><span class="nb-shiki-mdbnqw"> add</span><span class="nb-shiki-1itgoe"> &lt;</span><span class="nb-shiki-mdbnqw">bucke</span><span class="nb-shiki-140thh">t</span><span class="nb-shiki-1itgoe">&gt;</span><span class="nb-shiki-dzsirb"> --name</span><span class="nb-shiki-mdbnqw"> indefinite-logs</span><span class="nb-shiki-dzsirb"> --prefix</span><span class="nb-shiki-mdbnqw"> logs/</span><span class="nb-shiki-dzsirb"> --retention-indefinite</span></span></code></pre></figure> <p>For more information on bucket locks and how to set retention policies for objects in your R2 buckets, refer to our <a href="https://developers.cloudflare.com/r2/buckets/bucket-locks/">documentation</a>.</p>Thu, 06 Mar 2025 00:00:00 GMTR2R2Stream - Introducing Media Transformations from Cloudflare Streamhttps://developers.cloudflare.com/changelog/post/2025-03-06-media-transformations/https://developers.cloudflare.com/changelog/post/2025-03-06-media-transformations/<p>Today, we are thrilled to announce Media Transformations, a new service that brings the magic of <a href="https://developers.cloudflare.com/images/optimization/transformations/overview/">Image Transformations</a> to <em>short-form video files,</em> wherever they are stored!</p> <p>For customers with a huge volume of short video — generative AI output, e-commerce product videos, social media clips, or short marketing content — uploading those assets to Stream is not always practical. Sometimes, the greatest friction to getting started was the thought of all that migrating. Customers want a simpler solution that retains their current storage strategy to deliver small, optimized MP4 files. Now you can do that with Media Transformations.</p> <p>To transform a video or image, <a href="https://developers.cloudflare.com/stream/transform-videos/#getting-started">enable transformations</a> for your zone, then make a simple request with a specially formatted URL. The result is an MP4 that can be used in an HTML video element without a player library. If your zone already has Image Transformations enabled, then it is ready to optimize videos with Media Transformations, too.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="text"><figcaption class="nb-code-title"><span class="nb-code-title-name">URL format</span><span class="nb-code-title-lang">text</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="text" data-nb-lang="text"><code><span class="line"><span class="nb-shiki-wvjl67">https://example.com/cdn-cgi/media/&lt;OPTIONS&gt;/&lt;SOURCE-VIDEO&gt;</span></span></code></pre></figure> <p>For example, we have a short video of the mobile in Austin's office. The original is nearly 30 megabytes and wider than necessary for this layout. Consider a simple width adjustment:</p> <video controls><source src="https://developers.cloudflare.com/cdn-cgi/media/width=640/https://middlecache.ced.cloudflare.com/v1/aus-mobile/aus-mobile.mp4"/></video> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="text"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example URL</span><span class="nb-code-title-lang">text</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="text" data-nb-lang="text"><code><span class="line"><span class="nb-shiki-wvjl67">https://example.com/cdn-cgi/media/width=640/&lt;SOURCE-VIDEO&gt;</span></span> <span class="line"><span class="nb-shiki-wvjl67">https://developers.cloudflare.com/cdn-cgi/media/width=640/https://middlecache.ced.cloudflare.com/v1/aus-mobile/aus-mobile.mp4</span></span></code></pre></figure> <p>The result is less than 3 megabytes, properly sized, and delivered dynamically so that customers do not have to manage the creation and storage of these transformed assets.</p> <p>For more information, learn about <a href="https://developers.cloudflare.com/stream/transform-videos/">Transforming Videos</a>.</p>Thu, 06 Mar 2025 00:00:00 GMTStreamStreamBrowser Isolation - Gain visibility into user actions in Zero Trust Browser Isolation sessionshttps://developers.cloudflare.com/changelog/post/2025-03-03-user-action-logging/https://developers.cloudflare.com/changelog/post/2025-03-03-user-action-logging/<p>We're excited to announce that new logging capabilities for <a href="https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/">Remote Browser Isolation (RBI)</a> through <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/">Logpush</a> are available in Beta starting today!</p> <p>With these enhanced logs, administrators can gain visibility into end user behavior in the remote browser and track blocked data extraction attempts, along with the websites that triggered them, in an isolated session.</p> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "AccountID"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"$ACCOUNT_ID"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "Decision"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"block"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "DomainName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"www.example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "Timestamp"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-02-27T23:15:06Z"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "Type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"copy"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "UserID"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"$USER_ID"</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>User Actions available:</p> <ul> <li><strong>Copy &amp; Paste</strong></li> <li><strong>Downloads &amp; Uploads</strong></li> <li><strong>Printing</strong></li> </ul> <p>Learn more about how to get started with Logpush in our <a href="https://developers.cloudflare.com/logs/logpush/">documentation</a>.</p>Tue, 04 Mar 2025 00:00:00 GMTBrowser IsolationBrowser IsolationAccess - New SAML and OIDC Fields and SAML transforms for Access for SaaShttps://developers.cloudflare.com/changelog/post/2025-03-03-saml-oidc-fields-saml-transformations/https://developers.cloudflare.com/changelog/post/2025-03-03-saml-oidc-fields-saml-transformations/<p><a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/saas-apps/">Access for SaaS applications</a> now include more configuration options to support a wider array of SaaS applications.</p> <p><strong>SAML and OIDC Field Additions</strong></p> <p>OIDC apps now include:</p> <ul> <li>Group Filtering via RegEx</li> <li>OIDC Claim mapping from an IdP</li> <li>OIDC token lifetime control</li> <li>Advanced OIDC auth flows including hybrid and implicit flows</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1021,height=192,format=webp/_astro/oidc-claims.2di8l9Lv.png" alt="OIDC field additions" loading="lazy" decoding="async" width="1021" height="192"> <p>SAML apps now include improved SAML attribute mapping from an IdP.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1051,height=202,format=webp/_astro/saml-attribute-statements.CW45j5Qi.png" alt="SAML field additions" loading="lazy" decoding="async" width="1051" height="202"> <p><strong>SAML transformations</strong></p> <p>SAML identities sent to Access applications can be fully customized using JSONata expressions. This allows admins to configure the precise identity SAML statement sent to a SaaS application.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1030,height=254,format=webp/_astro/transformation-box.DyKn-DdN.png" alt="Configured SAML statement sent to application" loading="lazy" decoding="async" width="1030" height="254">Mon, 03 Mar 2025 00:00:00 GMTAccessAccessWAF - WAF Release - 2025-03-03https://developers.cloudflare.com/changelog/post/2025-03-03-waf-release/https://developers.cloudflare.com/changelog/post/2025-03-03-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="90356ececae3444b9accb3d393e63099"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...93e63099</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100721</td><td><p>Ivanti - Remote Code Execution - CVE:CVE-2024-13159, CVE:CVE-2024-13160, CVE:CVE-2024-13161</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6cf09ce2fa73482abb7f677ecac42ce2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...cac42ce2</span></button></rule-id></td><td>100596</td><td><p>Citrix Content Collaboration ShareFile - Remote Code Execution - CVE:CVE-2023-24489</p></td><td>N/A</td><td>Block</td><td></td></tr></tbody></table>Mon, 03 Mar 2025 00:00:00 GMTWAFWAFEmail security - Use Logpush for Email security detectionshttps://developers.cloudflare.com/changelog/post/2025-03-01-logpush-detections/https://developers.cloudflare.com/changelog/post/2025-03-01-logpush-detections/<p>You can now send detection logs to an endpoint of your choice with Cloudflare Logpush.</p> <p>Filter logs matching specific criteria you have set and select from over 25 fields you want to send. When creating a new Logpush job, remember to select <strong>Email security alerts</strong> as the dataset.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=927,height=688,format=webp/_astro/Logpush-Detections.Dc5tHta3.png" alt="logpush-detections" loading="lazy" decoding="async" width="927" height="688"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/email-security-logs/#enable-detection-logs">Enable detection logs</a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Sat, 01 Mar 2025 23:22:49 GMTEmail securityEmail securityWorkers - Use the latest JavaScript features with Wrangler CLI v4.0.0-rc.0https://developers.cloudflare.com/changelog/post/2025-02-28-wrangler-v4-rc/https://developers.cloudflare.com/changelog/post/2025-02-28-wrangler-v4-rc/ <p>We've released a release candidate of the next major version of <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, the CLI for Cloudflare Workers — <code>wrangler@4.0.0-rc.0</code>.</p> <p>You can run the following command to install it and be one of the first to try it out:</p> <script> if (!customElements.get("nb-pm-restore")) { customElements.define( "nb-pm-restore", class extends HTMLElement { connectedCallback() { const card = this.closest("[data-nb-pm]"); if (!card) return; let saved; try { saved = sessionStorage.getItem("ui-pm-tab"); } catch { return; } if (!saved) return; const tabs = card.querySelectorAll("[data-nb-pm-tab]"); let idx = -1; tabs.forEach(function (t, i) { if (t.textContent.trim() === saved) idx = i; }); if (idx < 1) return; tabs.forEach(function (t, i) { t.setAttribute("aria-selected", String(i === idx)); }); card.querySelectorAll("[data-nb-pm-panel]").forEach(function (p, i) { p.hidden = i !== idx; }); } }, ); } </script><div data-nb-pm class="w-full"><div class="flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card"><div class="flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]" role="tablist" aria-label="Package manager"><button role="tab" type="button" aria-selected="true" aria-controls="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-npm" id="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-npm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">npm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-yarn" id="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-yarn" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">yarn</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-pnpm" id="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-pnpm" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">pnpm</button><button role="tab" type="button" aria-selected="false" aria-controls="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-bun" id="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-bun" data-nb-pm-tab class="text-muted-foreground hover:bg-accent hover:text-foreground aria-selected:bg-selected aria-selected:text-foreground focus-visible:outline-ring m-0 cursor-pointer rounded-md border-0 bg-transparent px-2 py-0.5 text-xs leading-5 font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2">bun</button></div><div role="tabpanel" id="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-npm" aria-labelledby="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-npm" data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">npm</span><span class="text-warning"> i wrangler@v4-rc</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="npm i wrangler@v4-rc" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-yarn" aria-labelledby="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-yarn" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">yarn</span><span class="text-warning"> add wrangler@v4-rc</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="yarn add wrangler@v4-rc" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-pnpm" aria-labelledby="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-pnpm" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">pnpm</span><span class="text-warning"> add wrangler@v4-rc</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="pnpm add wrangler@v4-rc" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><div role="tabpanel" id="pm-panel-pm-850d8be8-6147-4277-8ef2-47d328540240-bun" aria-labelledby="pm-tab-pm-850d8be8-6147-4277-8ef2-47d328540240-bun" hidden data-nb-pm-panel class="bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring"><div class="flex items-stretch"><pre class="text-foreground my-0 min-w-0 grow overflow-x-auto border-0 bg-transparent px-4 py-3 font-mono text-sm leading-relaxed whitespace-pre"><code data-nb-pm-code><span class="text-success">bun</span><span class="text-warning"> add wrangler@v4-rc</span></code></pre><button type="button" data-nb-pm-copy data-nb-command="bun add wrangler@v4-rc" aria-label="Copy to clipboard" class="border-border text-muted-foreground hover:text-foreground focus-visible:outline-ring m-0 flex shrink-0 cursor-pointer items-center justify-center border-0 border-l border-solid bg-transparent px-3 transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2"><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[18px] w-[18px]" data-icon="ph:copy"><path fill="currentColor" d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8m-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z"/></svg><svg width="1em" height="1em" viewBox="0 0 256 256" class="hidden h-[18px] w-[18px]" data-icon="ph:check"><path fill="currentColor" d="m229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69L218.34 66.34a8 8 0 0 1 11.32 11.32"/></svg></button></div></div><nb-pm-restore style="display:contents"></nb-pm-restore></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&type=script&index=0&lang.ts"></script> <p>Unlike previous major versions of Wrangler, which were <a href="https://blog.cloudflare.com/wrangler-v2-beta/" target="_blank" rel="noopener">foundational rewrites<span class="external-link"> ↗</span></a> and <a href="https://blog.cloudflare.com/wrangler3/" target="_blank" rel="noopener">rearchitectures<span class="external-link"> ↗</span></a> — Version 4 of Wrangler includes a much smaller set of changes. If you use Wrangler today, your workflow is very unlikely to change. Before we release Wrangler v4 and advance past the release candidate stage, we'll share a detailed migration guide in the Workers developer docs. But for the vast majority of cases, you won't need to do anything to migrate — things will just work as they do today. We are sharing this release candidate in advance of the official release of v4, so that you can try it out early and share feedback.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="new-javascript-language-features-that-you-can-now-use-with-wrangler-v4">New JavaScript language features that you can now use with Wrangler v4</h4><a class="anchor-link" href="#new-javascript-language-features-that-you-can-now-use-with-wrangler-v4"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Version 4 of Wrangler updates the version of <a href="https://esbuild.github.io/" target="_blank" rel="noopener">esbuild<span class="external-link"> ↗</span></a> that Wrangler uses internally, allowing you to use modern JavaScript language features, including:</p> <div tabindex="-1" class="heading-wrapper level-h5"><h5 id="the-using-keyword-from-explicit-resource-management">The <code>using</code> keyword from Explicit Resource Management</h5><a class="anchor-link" href="#the-using-keyword-from-explicit-resource-management"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/#explicit-resource-management"><code>using</code> keyword from the Explicit Resource Management standard</a> makes it easier to work with the <a href="https://developers.cloudflare.com/workers/runtime-apis/rpc/">JavaScript-native RPC system built into Workers</a>. This means that when you obtain a stub, you can ensure that it is automatically disposed when you exit scope it was created in:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-1t8gfj"> sendEmail</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">id</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">message</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> using</span><span class="nb-shiki-dzsirb"> user</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">USER_SERVICE</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">findUser</span><span class="nb-shiki-140thh">(id);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> user.</span><span class="nb-shiki-1t8gfj">sendEmail</span><span class="nb-shiki-140thh">(message);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // user[Symbol.dispose]() is implicitly called at the end of the scope.</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h5"><h5 id="import-attributes">Import attributes</h5><a class="anchor-link" href="#import-attributes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with" target="_blank" rel="noopener">Import attributes<span class="external-link"> ↗</span></a> allow you to denote the type or other attributes of the module that your code imports. For example, you can import a JSON module, using the following syntax:</p> <figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> data </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "./data.json"</span><span class="nb-shiki-1itgoe"> with</span><span class="nb-shiki-140thh"> { type: </span><span class="nb-shiki-mdbnqw">"json"</span><span class="nb-shiki-140thh"> };</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="other-changes">Other changes</h4><a class="anchor-link" href="#other-changes"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <div tabindex="-1" class="heading-wrapper level-h5"><h5 id="--local-is-now-the-default-for-all-cli-commands"><code>--local</code> is now the default for all CLI commands</h5><a class="anchor-link" href="#--local-is-now-the-default-for-all-cli-commands"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>All commands that access resources (for example, <code>wrangler kv</code>, <code>wrangler r2</code>, <code>wrangler d1</code>) now access local datastores by default, ensuring consistent behavior.</p> <div tabindex="-1" class="heading-wrapper level-h5"><h5 id="clearer-policy-for-the-minimum-required-version-of-nodejs-required-to-run-wrangler">Clearer policy for the minimum required version of Node.js required to run Wrangler</h5><a class="anchor-link" href="#clearer-policy-for-the-minimum-required-version-of-nodejs-required-to-run-wrangler"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Moving forward, the <a href="https://nodejs.org/en/about/previous-releases" target="_blank" rel="noopener">active, maintenance, and current versions of Node.js<span class="external-link"> ↗</span></a> will be officially supported by Wrangler. This means the minimum officially supported version of Node.js you must have installed for Wrangler v4 will be Node.js v18 or later. This policy mirrors how many other packages and CLIs support older versions of Node.js, and ensures that as long as you are using a version of Node.js that the Node.js project itself supports, this will be supported by Wrangler as well.</p> <div tabindex="-1" class="heading-wrapper level-h5"><h5 id="features-previously-deprecated-in-wrangler-v3-are-now-removed-in-wrangler-v4">Features previously deprecated in Wrangler v3 are now removed in Wrangler v4</h5><a class="anchor-link" href="#features-previously-deprecated-in-wrangler-v3-are-now-removed-in-wrangler-v4"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>All previously deprecated features in <a href="https://developers.cloudflare.com/workers/wrangler/deprecations/#wrangler-v2" target="_blank" rel="noopener">Wrangler v2<span class="external-link"> ↗</span></a> and in <a href="https://developers.cloudflare.com/workers/wrangler/deprecations/#wrangler-v3" target="_blank" rel="noopener">Wrangler v3<span class="external-link"> ↗</span></a> have now been removed. Additionally, the following features that were deprecated during the Wrangler v3 release have been removed:</p> <ul> <li>Legacy Assets (using <code>wrangler dev/deploy --legacy-assets</code> or the <code>legacy_assets</code> config file property). Instead, we recommend you <a href="https://developers.cloudflare.com/workers/static-assets/" target="_blank" rel="noopener">migrate to Workers assets<span class="external-link"> ↗</span></a>.</li> <li>Legacy Node.js compatibility (using <code>wrangler dev/deploy --node-compat</code> or the <code>node_compat</code> config file property). Instead, use the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs" target="_blank" rel="noopener"><code>nodejs_compat</code> compatibility flag<span class="external-link"> ↗</span></a>. This includes the functionality from legacy <code>node_compat</code> polyfills and natively implemented Node.js APIs.</li> <li><code>wrangler version</code>. Instead, use <code>wrangler --version</code> to check the current version of Wrangler.</li> <li><code>getBindingsProxy()</code> (via <code>import { getBindingsProxy } from "wrangler"</code>). Instead, use the <a href="https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy" target="_blank" rel="noopener"><code>getPlatformProxy()</code> API<span class="external-link"> ↗</span></a>, which takes exactly the same arguments.</li> <li><code>usage_model</code>. This no longer has any effect, after the <a href="https://blog.cloudflare.com/workers-pricing-scale-to-zero/" target="_blank" rel="noopener">rollout of Workers Standard Pricing<span class="external-link"> ↗</span></a>.</li> </ul> <p>We'd love your feedback! If you find a bug or hit a roadblock when upgrading to Wrangler v4, <a href="https://github.com/cloudflare/workers-sdk/issues/new?template=bug-template.yaml" target="_blank" rel="noopener">open an issue on the <code>cloudflare/workers-sdk</code> repository on GitHub<span class="external-link"> ↗</span></a>.</p>Fri, 28 Feb 2025 00:00:00 GMTWorkersWorkersEmail security - Check status of Email security or Area 1https://developers.cloudflare.com/changelog/post/2025-02-07-check-status/https://developers.cloudflare.com/changelog/post/2025-02-07-check-status/<p>Concerns about performance for Email security or Area 1? You can now check the operational status of both on the <a href="https://www.cloudflarestatus.com/" target="_blank" rel="noopener">Cloudflare Status page<span class="external-link"> ↗</span></a>.</p> <p>For Email security, look under <strong>Cloudflare Sites and Services</strong>.</p> <ul> <li><strong>Dashboard</strong> is the dashboard for Cloudflare, including Email security</li> <li><strong>Email security (Zero Trust)</strong> is the processing of email</li> <li><strong>API</strong> are the Cloudflare endpoints, including the ones for Email security</li> </ul> <p>For Area 1, under <strong>Cloudflare Sites and Services</strong>:</p> <ul> <li><strong>Area 1 - Dash</strong> is the dashboard for Cloudflare, including Email security</li> <li><strong>Email security (Area1)</strong> is the processing of email</li> <li><strong>Area 1 - API</strong> are the Area 1 endpoints</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=792,height=348,format=webp/_astro/Status-Page.DcFJ1286.png" alt="Status-page" loading="lazy" decoding="async" width="792" height="348"> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 27 Feb 2025 23:22:49 GMTEmail securityEmail securityBrowser Run - New REST API is in open beta!https://developers.cloudflare.com/changelog/post/2025-02-27-br-rest-api-beta/https://developers.cloudflare.com/changelog/post/2025-02-27-br-rest-api-beta/<p>We've released a new REST API for <a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> in open beta, making interacting with browsers easier than ever. This new API provides endpoints for common browser actions, with more to be added in the future.</p> <p>With the <strong>REST API</strong> you can:</p> <ul> <li><strong>Capture screenshots</strong> – Use <code>/screenshot</code> to take a screenshot of a webpage from provided URL or HTML.</li> <li><strong>Generate PDFs</strong> – Use <code>/pdf</code> to convert web pages into PDFs.</li> <li><strong>Extract HTML content</strong> – Use <code>/content</code> to retrieve the full HTML from a page. <strong>Snapshot (HTML + Screenshot)</strong> – Use <code>/snapshot</code> to capture both the page's HTML and a screenshot in one request</li> <li><strong>Scrape Web Elements</strong> – Use <code>/scrape</code> to extract specific elements from a page.</li> </ul> <p>For example, to capture a screenshot:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Screenshot example</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> 'https://api.cloudflare.com/client/v4/accounts/&lt;accountId&gt;/browser-rendering/screenshot'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer &lt;apiToken&gt;'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -H</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> -d</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "html": "Hello World!",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "screenshotOptions": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "type": "webp",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "omitBackground": true</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --output</span><span class="nb-shiki-mdbnqw"> "screenshot.webp"</span></span></code></pre></figure> <p>Learn more in our <a href="https://developers.cloudflare.com/browser-run/quick-actions/">documentation</a>.</p>Thu, 27 Feb 2025 00:00:00 GMTBrowser RunBrowser RunRadar - DNS Insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-02-27-radar-dns-insights/https://developers.cloudflare.com/changelog/post/2025-02-27-radar-dns-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> has expanded its DNS insights, providing visibility into aggregated traffic and usage trends observed by our <a href="https://developers.cloudflare.com/1.1.1.1/">1.1.1.1</a> DNS resolver. In addition to global, location, and ASN traffic trends, we are also providing perspectives on protocol usage, query/response characteristics, and DNSSEC usage.</p> <p>Previously limited to the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/subresources/top/"><code>top</code></a> locations and ASes endpoints, we have now introduced the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/methods/timeseries/"><code>/dns/timeseries</code></a>: Retrieves DNS query volume over time.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/subresources/summary/"><code>/dns/summary/{dimension}</code></a>: Retrieves summaries of DNS query distribution across ten different dimensions.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/dns/subresources/timeseries_groups/"><code>/dns/timeseries_groups/{dimension}</code></a>: Retrieves timeseries data for DNS query distribution across ten different dimensions.</li> </ul> <p>For the <code>summary</code> and <code>timeseries_groups</code> endpoints, the following dimensions are available, displaying the distribution of DNS queries based on:</p> <ul> <li><code>cache_hit</code>: Cache status (hit vs. miss).</li> <li><code>dnsssec</code>: DNSSEC support status (secure, insecure, invalid or other).</li> <li><code>dnsssec_aware</code>: DNSSEC client awareness (aware vs. not-aware).</li> <li><code>dnsssec_e2e</code>: End-to-end security (secure vs. insecure).</li> <li><code>ip_version</code>: IP version (IPv4 vs. IPv6).</li> <li><code>matching_answer</code>: Matching answer status (match vs. no-match).</li> <li><code>protocol</code>: Transport protocol (UDP, TLS, HTTPS or TCP).</li> <li><code>query_type</code>: Query type (<code>A</code>, <code>AAAA</code>, <code>PTR</code>, etc.).</li> <li><code>response_code</code>: Response code (<code>NOERROR</code>, <code>NXDOMAIN</code>, <code>REFUSED</code>, etc.).</li> <li><code>response_ttl</code>: Response TTL.</li> </ul> <p>Learn more about the new Radar DNS insights in our <a href="https://blog.cloudflare.com/new-dns-section-on-cloudflare-radar/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>, and check out the <a href="https://radar.cloudflare.com/dns" target="_blank" rel="noopener">new Radar page<span class="external-link"> ↗</span></a>.</p>Thu, 27 Feb 2025 00:00:00 GMTRadarRadarAI Gateway - Introducing Guardrails in AI Gatewayhttps://developers.cloudflare.com/changelog/post/2025-02-26-guardrails/https://developers.cloudflare.com/changelog/post/2025-02-26-guardrails/<p><a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> now includes <a href="https://developers.cloudflare.com/ai-gateway/features/guardrails/">Guardrails</a>, to help you monitor your AI apps for harmful or inappropriate content and deploy safely.</p> <p>Within the AI Gateway settings, you can configure:</p> <ul> <li><strong>Guardrails</strong>: Enable or disable content moderation as needed.</li> <li><strong>Evaluation scope</strong>: Select whether to moderate user prompts, model responses, or both.</li> <li><strong>Hazard categories</strong>: Specify which categories to monitor and determine whether detected inappropriate content should be blocked or flagged.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2524,height=444,format=webp/_astro/Guardrails.BTNc0qeC.png" alt="Guardrails in AI Gateway" loading="lazy" decoding="async" width="2524" height="444"> <p>Learn more in the <a href="https://blog.cloudflare.com/guardrails-in-ai-gateway/" target="_blank" rel="noopener">blog<span class="external-link"> ↗</span></a> or our <a href="https://developers.cloudflare.com/ai-gateway/features/guardrails/">documentation</a>.</p>Wed, 26 Feb 2025 00:00:00 GMTAI GatewayAI GatewayEmail security - Use DLP Assist for M365https://developers.cloudflare.com/changelog/post/2025-02-25-dlp-assist-for-m365/https://developers.cloudflare.com/changelog/post/2025-02-25-dlp-assist-for-m365/<p>Cloudflare Email security customers who have Microsoft 365 environments can quickly deploy an Email DLP (Data Loss Prevention) solution for free.</p> <p>Simply deploy our add-in, create a DLP policy in Cloudflare, and configure Outlook to trigger behaviors like displaying a banner, alerting end users before sending, or preventing delivery entirely.</p> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/outbound-dlp/">Outbound Data Loss Prevention</a> to learn more about this feature.</p> <p>In GUI alert:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1357,height=212,format=webp/_astro/DLP-Alert.5s-fbKn3.png" alt="DLP-Alert" loading="lazy" decoding="async" width="1357" height="212"> <p>Alert before sending:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1362,height=479,format=webp/_astro/DLP-Pop-up.0gkYy7o5.png" alt="DLP-Pop-up" loading="lazy" decoding="async" width="1362" height="479"> <p>Prevent delivery:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1353,height=329,format=webp/_astro/DLP-Blocked.CmQkGrnM.png" alt="DLP-Blocked" loading="lazy" decoding="async" width="1353" height="329"> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Tue, 25 Feb 2025 23:22:49 GMTEmail securityEmail securityAgents, Workers - Introducing the Agents SDKhttps://developers.cloudflare.com/changelog/post/2025-02-25-agents-sdk/https://developers.cloudflare.com/changelog/post/2025-02-25-agents-sdk/<p>We've released the <a href="http://blog.cloudflare.com/build-ai-agents-on-cloudflare/" target="_blank" rel="noopener">Agents SDK<span class="external-link"> ↗</span></a>, a package and set of tools that help you build and ship AI Agents.</p> <p>You can get up and running with a <a href="https://github.com/cloudflare/agents-starter" target="_blank" rel="noopener">chat-based AI Agent<span class="external-link"> ↗</span></a> (and deploy it to Workers) that uses the Agents SDK, tool calling, and state syncing with a React-based front-end by running the following command:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> cloudflare@latest</span><span class="nb-shiki-mdbnqw"> agents-starter</span><span class="nb-shiki-dzsirb"> --</span><span class="nb-shiki-dzsirb"> --template=</span><span class="nb-shiki-mdbnqw">"cloudflare/agents-starter"</span></span> <span class="line"><span class="nb-shiki-21nrsd"># open up README.md and follow the instructions</span></span></code></pre></figure> <p>You can also add an Agent to any existing Workers application by installing the <code>agents</code> package directly</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> i</span><span class="nb-shiki-mdbnqw"> agents</span></span></code></pre></figure> <p>... and then define your first Agent:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { Agent } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> YourAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> Agent</span><span class="nb-shiki-140thh">&lt;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">&gt; {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Build it out</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Access state on this.state or query the Agent's database via this.sql</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Handle WebSocket events with onConnect and onMessage</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Run tasks on a schedule with this.schedule</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Call AI models</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ... and/or call other Agents.</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Head over to the <a href="https://developers.cloudflare.com/agents/">Agents documentation</a> to learn more about the Agents SDK, the SDK APIs, as well as how to test and deploying agents to production.</p>Tue, 25 Feb 2025 00:00:00 GMTAgentsAgentsWorkersWorkers AI - Workers AI now supports structured JSON outputs.https://developers.cloudflare.com/changelog/post/2025-02-25-json-mode/https://developers.cloudflare.com/changelog/post/2025-02-25-json-mode/ <p>Workers AI now supports structured JSON outputs with <a href="https://developers.cloudflare.com/workers-ai/features/json-mode/">JSON mode</a>, which allows you to request a structured output response when interacting with AI models.</p> <p>This makes it much easier to retrieve structured data from your AI models, and avoids the (error prone!) need to parse large unstructured text responses to extract your data.</p> <p>JSON mode in Workers AI is compatible with the OpenAI SDK's <a href="https://platform.openai.com/docs/guides/structured-outputs" target="_blank" rel="noopener">structured outputs<span class="external-link"> ↗</span></a> <code>response_format</code> API, which can be used directly in a Worker:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { OpenAI } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "openai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Define your JSON schema for a calendar event</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> CalendarEventSchema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> properties: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> date: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> participants: { type: </span><span class="nb-shiki-mdbnqw">"array"</span><span class="nb-shiki-140thh">, items: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> } },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> required: [</span><span class="nb-shiki-mdbnqw">"name"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"date"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"participants"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> OpenAI</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> apiKey: env.</span><span class="nb-shiki-dzsirb">OPENAI_API_KEY</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Optional: use AI Gateway to bring logs, evals &#x26; caching to your AI requests</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // https://developers.cloudflare.com/ai-gateway/usage/providers/openai/</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // baseUrl: "https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/openai"</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.chat.completions.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"gpt-4o-2024-08-06"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { role: </span><span class="nb-shiki-mdbnqw">"system"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"Extract the event information."</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content: </span><span class="nb-shiki-mdbnqw">"Alice and Bob are going to a science fair on Friday."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Use the `response_format` option to request a structured JSON output</span></span> <span class="line"><span class="nb-shiki-140thh"> response_format: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set json_schema and provide ra schema, or json_object and parse it yourself</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"json_schema"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> schema: CalendarEventSchema, </span><span class="nb-shiki-21nrsd">// provide a schema</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // This will be of type CalendarEventSchema</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> response.choices[</span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">].message.parsed;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> calendar_event: event,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { OpenAI } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "openai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> OPENAI_API_KEY</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Define your JSON schema for a calendar event</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> CalendarEventSchema</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"object"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> properties: {</span></span> <span class="line"><span class="nb-shiki-140thh"> name: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> date: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> participants: { type: </span><span class="nb-shiki-mdbnqw">"array"</span><span class="nb-shiki-140thh">, items: { type: </span><span class="nb-shiki-mdbnqw">"string"</span><span class="nb-shiki-140thh"> } },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> required: [</span><span class="nb-shiki-mdbnqw">"name"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"date"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"participants"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> client</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> OpenAI</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> apiKey: env.</span><span class="nb-shiki-dzsirb">OPENAI_API_KEY</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Optional: use AI Gateway to bring logs, evals &amp; caching to your AI requests</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // https://developers.cloudflare.com/ai-gateway/usage/providers/openai/</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // baseUrl: "https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/openai"</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> client.chat.completions.</span><span class="nb-shiki-1t8gfj">create</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: </span><span class="nb-shiki-mdbnqw">"gpt-4o-2024-08-06"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [</span></span> <span class="line"><span class="nb-shiki-140thh"> { role: </span><span class="nb-shiki-mdbnqw">"system"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"Extract the event information."</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> content: </span><span class="nb-shiki-mdbnqw">"Alice and Bob are going to a science fair on Friday."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Use the `response_format` option to request a structured JSON output</span></span> <span class="line"><span class="nb-shiki-140thh"> response_format: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Set json_schema and provide ra schema, or json_object and parse it yourself</span></span> <span class="line"><span class="nb-shiki-140thh"> type: </span><span class="nb-shiki-mdbnqw">"json_schema"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> schema: CalendarEventSchema, </span><span class="nb-shiki-21nrsd">// provide a schema</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // This will be of type CalendarEventSchema</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> event</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> response.choices[</span><span class="nb-shiki-dzsirb">0</span><span class="nb-shiki-140thh">].message.parsed;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> calendar_event: event,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>To learn more about JSON mode and structured outputs, visit the <a href="https://developers.cloudflare.com/workers-ai/features/json-mode/">Workers AI documentation</a>.</p>Tue, 25 Feb 2025 00:00:00 GMTWorkers AIWorkers AIWorkflows - Concurrent Workflow instances limits increased.https://developers.cloudflare.com/changelog/post/2025-02-25-workflows-concurrency-increased/https://developers.cloudflare.com/changelog/post/2025-02-25-workflows-concurrency-increased/ <p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> now supports up to 4,500 concurrent (running) instances, up from the previous limit of 100. This limit will continue to increase during the Workflows open beta. This increase applies to all users on the Workers Paid plan, and takes effect immediately.</p> <p>Review the Workflows <a href="https://developers.cloudflare.com/workflows/reference/limits">limits documentation</a> and/or dive into the <a href="https://developers.cloudflare.com/workflows/get-started/guide/">get started guide</a> to start building on Workflows.</p>Tue, 25 Feb 2025 00:00:00 GMTWorkflowsWorkflowsCloudflare Images - Bind the Images API to your Workerhttps://developers.cloudflare.com/changelog/post/2025-02-21-images-bindings-in-workers/https://developers.cloudflare.com/changelog/post/2025-02-21-images-bindings-in-workers/ <p>You can now <a href="https://developers.cloudflare.com/images/optimization/binding/">interact with the Images API</a> directly in your Worker.</p> <p>This allows more fine-grained control over transformation request flows and cache behavior. For example, you can resize, manipulate, and overlay images without requiring them to be accessible through a URL.</p> <p>The Images binding can be configured in the Cloudflare dashboard for your Worker or in the Wrangler configuration file in your project's directory:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "images"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "binding"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"IMAGES"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-21nrsd">// i.e. available in your Worker on env.IMAGES</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[</span><span class="nb-shiki-1t8gfj">images</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh">binding = </span><span class="nb-shiki-mdbnqw">"IMAGES"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>Within your Worker code, you can interact with this binding by using <code>env.IMAGES</code>.</p> <p>Here's how you can rotate, resize, and blur an image, then output the image as AVIF:</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> info</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">IMAGES</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">info</span><span class="nb-shiki-140thh">(stream);</span></span> <span class="line"><span class="nb-shiki-21nrsd">// stream contains a valid image, and width/height is available on the info object</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-1t8gfj"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> (</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">IMAGES</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">input</span><span class="nb-shiki-140thh">(stream)</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">({ rotate: </span><span class="nb-shiki-dzsirb">90</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">({ width: </span><span class="nb-shiki-dzsirb">128</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">({ blur: </span><span class="nb-shiki-dzsirb">20</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">output</span><span class="nb-shiki-140thh">({ format: </span><span class="nb-shiki-mdbnqw">"image/avif"</span><span class="nb-shiki-140thh"> })</span></span> <span class="line"><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">response</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">return</span><span class="nb-shiki-140thh"> response;</span></span></code></pre></figure> <p>For more information, refer to <a href="https://developers.cloudflare.com/images/optimization/binding/">Images Bindings</a>.</p>Mon, 24 Feb 2025 00:00:00 GMTCloudflare ImagesCloudflare ImagesR2 - Super Slurper now supports migrations from all S3-compatible storage providershttps://developers.cloudflare.com/changelog/post/2025-02-24-r2-super-slurper-s3-compatible-support/https://developers.cloudflare.com/changelog/post/2025-02-24-r2-super-slurper-s3-compatible-support/<p><a href="https://developers.cloudflare.com/r2/data-migration/super-slurper/">Super Slurper</a> can now migrate data from any S3-compatible object storage provider to <a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a>. This includes transfers from services like MinIO, Wasabi, Backblaze B2, and DigitalOcean Spaces.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=757,height=348,format=webp/_astro/super-slurper-s3-compat-screenshot-border.D8Gd5eye.png" alt="Super Slurper S3-Compatible Source" loading="lazy" decoding="async" width="757" height="348"> <p>For more information on Super Slurper and how to migrate data from your existing S3-compatible storage buckets to R2, refer to our <a href="https://developers.cloudflare.com/r2/data-migration/super-slurper/">documentation</a>.</p>Mon, 24 Feb 2025 00:00:00 GMTR2R2WAF - WAF Release - 2025-02-24https://developers.cloudflare.com/changelog/post/2025-02-24-waf-release/https://developers.cloudflare.com/changelog/post/2025-02-24-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f7b9d265b86f448989fb0f054916911e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...4916911e</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100718A</td><td>SonicWall SSLVPN 2 - Auth Bypass - CVE:CVE-2024-53704</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="77c13c611d2a4fa3a89c0fafc382fdec"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c382fdec</span></button></rule-id></td><td>100720</td><td>Palo Alto Networks - Auth Bypass - CVE:CVE-2025-0108</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Mon, 24 Feb 2025 00:00:00 GMTWAFWAFWorkers AI - Workers AI larger context windowshttps://developers.cloudflare.com/changelog/post/2025-02-24-context-windows/https://developers.cloudflare.com/changelog/post/2025-02-24-context-windows/<p>We've updated the Workers AI text generation models to include context windows and limits definitions and changed our APIs to estimate and validate the number of tokens in the input prompt, not the number of characters.</p> <p>This update allows developers to use larger context windows when interacting with Workers AI models, which can lead to better and more accurate results.</p> <p>Our <a href="https://developers.cloudflare.com/workers-ai/models/">catalog page</a> provides more information about each model's supported context window.</p>Mon, 24 Feb 2025 00:00:00 GMTWorkers AIWorkers AIZaraz - Zaraz moves to the “Tag Management” category in the Cloudflare dashboardhttps://developers.cloudflare.com/changelog/post/2025-02-24-zaraz-dash-placement/https://developers.cloudflare.com/changelog/post/2025-02-24-zaraz-dash-placement/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1920,height=480,format=webp/_astro/zaraz-account-level.L5Bz9oN0.jpg" alt="Zaraz at zone level to Tag management at account level" loading="lazy" decoding="async" width="1920" height="480"> <p>Previously, you could only configure Zaraz by going to each individual zone under your Cloudflare account. Now, if you’d like to get started with Zaraz or manage your existing configuration, you can navigate to the <a href="https://dash.cloudflare.com/?to=/:account/tag-management/zaraz" target="_blank" rel="noopener">Tag Management<span class="external-link"> ↗</span></a> section on the Cloudflare dashboard – this will make it easier to compare and configure the same settings across multiple zones.</p> <p>These changes will not alter any existing configuration or entitlements for zones you already have Zaraz enabled on. If you’d like to edit existing configurations, you can go to the <a href="https://dash.cloudflare.com/?to=/:account/tag-management/zaraz" target="_blank" rel="noopener">Tag Setup<span class="external-link"> ↗</span></a> section of the dashboard, and select the zone you'd like to edit.</p>Mon, 24 Feb 2025 00:00:00 GMTZarazZarazWorkers for Platforms - Workers for Platforms - Instant dispatch for newly created User Workershttps://developers.cloudflare.com/changelog/post/2025-02-20-synchronous-uploads/https://developers.cloudflare.com/changelog/post/2025-02-20-synchronous-uploads/<p><a href="https://developers.cloudflare.com/cloudflare-for-platforms/" target="_blank" rel="noopener">Workers for Platforms<span class="external-link"> ↗</span></a> is an architecture wherein a centralized <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#dynamic-dispatch-worker">dispatch Worker</a> processes incoming requests and routes them to isolated sub-Workers, called <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#user-workers">User Workers</a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1366,height=711,format=webp/_astro/wfp-request.CZmZLaYf.png" alt="Workers for Platforms Requests" loading="lazy" decoding="async" width="1366" height="711"> <p>Previously, when a new User Worker was uploaded, there was a short delay before it became available for dispatch. This meant that even though an API request could return a 200 OK response, the script might not yet be ready to handle requests, causing unexpected failures for platforms that immediately dispatch to new Workers.</p> <p><strong>With this update, first-time uploads of User Workers are now deployed synchronously</strong>. A 200 OK response guarantees the script is fully provisioned and ready to handle traffic immediately, ensuring more predictable deployments and reducing errors.</p>Thu, 20 Feb 2025 17:00:00 GMTWorkers for PlatformsWorkers for PlatformsWorkers AI - Workers AI updated pricinghttps://developers.cloudflare.com/changelog/post/2025-02-20-updated-pricing-docs/https://developers.cloudflare.com/changelog/post/2025-02-20-updated-pricing-docs/<p>We've updated the Workers AI <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">pricing</a> to include the latest models and how model usage maps to Neurons.</p> <ul> <li>Each model's core input format(s) (tokens, audio seconds, images, etc) now include mappings to Neurons, making it easier to understand how your included Neuron volume is consumed and how you are charged at scale</li> <li>Per-model pricing, instead of the previous bucket approach, allows us to be more flexible on how models are charged based on their size, performance and capabilities. As we optimize each model, we can then pass on savings for that model.</li> <li>You will still only pay for what you consume: Workers AI inference is serverless, and not billed by the hour.</li> </ul> <p>Going forward, models will be launched with their associated Neuron costs, and we'll be updating the Workers AI dashboard and API to reflect consumption in both raw units and Neurons. Visit the <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/">Workers AI pricing</a> page to learn more about Workers AI pricing.</p>Thu, 20 Feb 2025 00:00:00 GMTWorkers AIWorkers AIWorkers - Autofix Worker name configuration errors at build timehttps://developers.cloudflare.com/changelog/post/2025-02-20-builds-name-conflict/https://developers.cloudflare.com/changelog/post/2025-02-20-builds-name-conflict/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2416,height=1128,format=webp/_astro/gh-auto-pr-name.BHTtigEg.png" alt="Auto-fixing Workers Name in Git Repo" loading="lazy" decoding="async" width="2416" height="1128"> <p>Small misconfigurations shouldn’t break your deployments. Cloudflare is introducing automatic error detection and fixes in <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Workers Builds</a>, identifying common issues in your wrangler.toml or wrangler.jsonc and proactively offering fixes, so you spend less time debugging and more time shipping.</p> <p>Here's how it works:</p> <ol> <li>Before running your build, Cloudflare checks your Worker's Wrangler configuration file (wrangler.toml or wrangler.jsonc) for common errors.</li> <li>Once you submit a build, if Cloudflare finds an error it can fix, it will submit a pull request to your repository that fixes it.</li> <li>Once you merge this pull request, Cloudflare will run another build.</li> </ol> <p>We're starting with fixing name mismatches between your Wrangler file and the Cloudflare dashboard, a top cause of build failures.</p> <p>This is just the beginning, we want your feedback on what other errors we should catch and fix next. Let us know in the Cloudflare Developers Discord, <a href="https://discord.com/channels/595317990191398933/1064502845061210152" target="_blank" rel="noopener">#workers-and-pages-feature-suggestions<span class="external-link"> ↗</span></a>.</p>Thu, 20 Feb 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-02-18https://developers.cloudflare.com/changelog/post/2025-02-18-waf-release/https://developers.cloudflare.com/changelog/post/2025-02-18-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="d1d45e4f59014f0fb22e0e6aa2ffa4b8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a2ffa4b8</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100715</td><td>FortiOS - Auth Bypass - CVE:CVE-2024-55591</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="14b5cdeb4cde490ba37d83555a883e12"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5a883e12</span></button></rule-id></td><td>100716</td><td>Ivanti - Auth Bypass - CVE:CVE-2021-44529</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="498fcd81a62a4b5ca943e2de958094d3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...958094d3</span></button></rule-id></td><td>100717</td><td>SimpleHelp - Auth Bypass - CVE:CVE-2024-57727</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6e0d8afc36ba4ce9836f81e63b66df22"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...3b66df22</span></button></rule-id></td><td>100718</td><td>SonicWall SSLVPN - Auth Bypass - CVE:CVE-2024-53704</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="8eb4536dba1a4da58fbf81c79184699f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9184699f</span></button></rule-id></td><td>100719</td><td>Yeti Platform - Auth Bypass - CVE:CVE-2024-46507</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Tue, 18 Feb 2025 00:00:00 GMTWAFWAFQueues - Customize queue message retention periodshttps://developers.cloudflare.com/changelog/post/2025-02-14-customize-queue-retention-period/https://developers.cloudflare.com/changelog/post/2025-02-14-customize-queue-retention-period/<p>You can now customize a queue's message retention period, from a minimum of 60 seconds to a maximum of 14 days. Previously, it was fixed to the default of 4 days.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1898,height=986,format=webp/_astro/customize-retention-period.CpK7s10q.png" alt="Customize a queue's message retention period" loading="lazy" decoding="async" width="1898" height="986"> <p>You can customize the retention period on the settings page for your queue, or using Wrangler:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Update message retention period</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">$</span><span class="nb-shiki-mdbnqw"> wrangler</span><span class="nb-shiki-mdbnqw"> queues</span><span class="nb-shiki-mdbnqw"> update</span><span class="nb-shiki-mdbnqw"> my-queue</span><span class="nb-shiki-dzsirb"> --message-retention-period-secs</span><span class="nb-shiki-dzsirb"> 600</span></span></code></pre></figure> <p>This feature is available on all new and existing queues. If you haven't used Cloudflare Queues before, <a href="https://developers.cloudflare.com/queues/get-started">get started with the Cloudflare Queues guide</a>.</p>Fri, 14 Feb 2025 12:00:00 GMTQueuesQueuesAgents, Workers, Workflows - Build AI Agents with Example Promptshttps://developers.cloudflare.com/changelog/post/2025-02-14-example-ai-prompts/https://developers.cloudflare.com/changelog/post/2025-02-14-example-ai-prompts/<p>We've added an <a href="https://developers.cloudflare.com/workers/get-started/prompting/">example prompt</a> to help you get started with building AI agents and applications on Cloudflare <a href="https://developers.cloudflare.com/workers/">Workers</a>, including <a href="https://developers.cloudflare.com/workflows/">Workflows</a>, <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>, and <a href="https://developers.cloudflare.com/kv/">Workers KV</a>.</p> <p>You can use this prompt with your favorite AI model, including Claude 3.5 Sonnet, OpenAI's o3-mini, Gemini 2.0 Flash, or Llama 3.3 on Workers AI. Models with large context windows will allow you to paste the prompt directly: provide your own prompt within the <code>&lt;user_prompt&gt;&lt;/user_prompt&gt;</code> tags.</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-140thh">{paste_prompt_here}</span></span> <span class="line"><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-1t8gfj">user_prompt</span><span class="nb-shiki-140thh">&gt;</span></span> <span class="line"><span class="nb-shiki-1t8gfj">user:</span><span class="nb-shiki-mdbnqw"> Build</span><span class="nb-shiki-mdbnqw"> an</span><span class="nb-shiki-mdbnqw"> AI</span><span class="nb-shiki-mdbnqw"> agent</span><span class="nb-shiki-mdbnqw"> using</span><span class="nb-shiki-mdbnqw"> Cloudflare</span><span class="nb-shiki-mdbnqw"> Workflows.</span><span class="nb-shiki-mdbnqw"> The</span><span class="nb-shiki-mdbnqw"> Workflow</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> when</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> new</span><span class="nb-shiki-mdbnqw"> GitHub</span><span class="nb-shiki-mdbnqw"> issue</span><span class="nb-shiki-mdbnqw"> is</span><span class="nb-shiki-mdbnqw"> opened</span><span class="nb-shiki-mdbnqw"> on</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> specific</span><span class="nb-shiki-mdbnqw"> project</span><span class="nb-shiki-mdbnqw"> with</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> label</span><span class="nb-shiki-mdbnqw"> 'help'</span><span class="nb-shiki-mdbnqw"> or</span><span class="nb-shiki-mdbnqw"> 'bug',</span><span class="nb-shiki-mdbnqw"> and</span><span class="nb-shiki-mdbnqw"> attempt</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> help</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> user</span><span class="nb-shiki-mdbnqw"> troubleshoot</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> issue</span><span class="nb-shiki-mdbnqw"> by</span><span class="nb-shiki-mdbnqw"> calling</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> OpenAI</span><span class="nb-shiki-mdbnqw"> API</span><span class="nb-shiki-mdbnqw"> with</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> issue</span><span class="nb-shiki-mdbnqw"> title</span><span class="nb-shiki-mdbnqw"> and</span><span class="nb-shiki-mdbnqw"> description,</span><span class="nb-shiki-mdbnqw"> and</span><span class="nb-shiki-mdbnqw"> a</span><span class="nb-shiki-mdbnqw"> clear,</span><span class="nb-shiki-mdbnqw"> structured</span><span class="nb-shiki-mdbnqw"> prompt</span><span class="nb-shiki-mdbnqw"> that</span><span class="nb-shiki-mdbnqw"> asks</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> model</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> suggest</span><span class="nb-shiki-mdbnqw"> 1-3</span><span class="nb-shiki-mdbnqw"> possible</span><span class="nb-shiki-mdbnqw"> solutions</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> issue.</span><span class="nb-shiki-mdbnqw"> Any</span><span class="nb-shiki-mdbnqw"> code</span><span class="nb-shiki-mdbnqw"> snippets</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> be</span><span class="nb-shiki-mdbnqw"> formatted</span><span class="nb-shiki-mdbnqw"> in</span><span class="nb-shiki-mdbnqw"> Markdown</span><span class="nb-shiki-mdbnqw"> code</span><span class="nb-shiki-mdbnqw"> blocks.</span><span class="nb-shiki-mdbnqw"> Documentation</span><span class="nb-shiki-mdbnqw"> and</span><span class="nb-shiki-mdbnqw"> sources</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> be</span><span class="nb-shiki-mdbnqw"> referenced</span><span class="nb-shiki-mdbnqw"> at</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> bottom</span><span class="nb-shiki-mdbnqw"> of</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> response.</span><span class="nb-shiki-mdbnqw"> The</span><span class="nb-shiki-mdbnqw"> agent</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> then</span><span class="nb-shiki-mdbnqw"> post</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> response</span><span class="nb-shiki-mdbnqw"> to</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> GitHub</span><span class="nb-shiki-mdbnqw"> issue.</span><span class="nb-shiki-mdbnqw"> The</span><span class="nb-shiki-mdbnqw"> agent</span><span class="nb-shiki-mdbnqw"> should</span><span class="nb-shiki-mdbnqw"> run</span><span class="nb-shiki-mdbnqw"> as</span><span class="nb-shiki-mdbnqw"> the</span><span class="nb-shiki-mdbnqw"> provided</span><span class="nb-shiki-mdbnqw"> GitHub</span><span class="nb-shiki-mdbnqw"> bot</span><span class="nb-shiki-mdbnqw"> account.</span></span> <span class="line"><span class="nb-shiki-1itgoe">&lt;</span><span class="nb-shiki-140thh">/user_prompt</span><span class="nb-shiki-1itgoe">&gt;</span></span></code></pre></figure> <p>This prompt is still experimental, but we encourage you to try it out and <a href="https://github.com/cloudflare/cloudflare-docs/issues/new?template=content.edit.yml" target="_blank" rel="noopener">provide feedback<span class="external-link"> ↗</span></a>.</p>Fri, 14 Feb 2025 00:00:00 GMTAgentsAgentsWorkersWorkflowsCloudflare One Appliance, Cloudflare One, Cloudflare WAN - Configure your Magic WAN Connector to connect via static IP assignmenthttps://developers.cloudflare.com/changelog/post/2025-02-14-local-console-access/https://developers.cloudflare.com/changelog/post/2025-02-14-local-console-access/<p>You can now locally configure your <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/">Magic WAN Connector</a> to work in a static IP configuration.</p> <p>This local method does not require having access to a DHCP Internet connection. However, it does require being comfortable with using tools to access the serial port on Magic WAN Connector as well as using a serial terminal client to access the Connector's environment.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-hardware-appliance/#bootstrap-via-serial-console">WAN with a static IP address</a>.</p>Fri, 14 Feb 2025 00:00:00 GMTCloudflare One ApplianceCloudflare One ApplianceCloudflare OneCloudflare WANR2 - Super Slurper now transfers data to R2 up to 5x fasterhttps://developers.cloudflare.com/changelog/post/2025-02-14-r2-super-slurper-faster-migrations/https://developers.cloudflare.com/changelog/post/2025-02-14-r2-super-slurper-faster-migrations/<p><a href="https://developers.cloudflare.com/r2/data-migration/super-slurper/">Super Slurper</a> now transfers data from cloud object storage providers like AWS S3 and Google Cloud Storage to <a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a> up to 5x faster than it did before.</p> <p>We moved from a centralized service to a distributed system built on the Cloudflare Developer Platform — using <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>, <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>, and <a href="https://developers.cloudflare.com/queues/">Queues</a> — to both improve performance and increase system concurrency capabilities (and we'll share more details about how we did it soon!)</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=974,height=493,format=webp/_astro/slurper-objects-over-time-border.BFDkMQUw.png" alt="Super Slurper Objects Migrated" loading="lazy" decoding="async" width="974" height="493"> <p><em>Time to copy 75,000 objects from AWS S3 to R2 decreased from 15 minutes 30 seconds (old) to 3 minutes 25 seconds (after performance improvements)</em></p> <p>For more information on Super Slurper and how to migrate data from existing object storage to R2, refer to our <a href="https://developers.cloudflare.com/r2/data-migration/super-slurper/">documentation</a>.</p>Fri, 14 Feb 2025 00:00:00 GMTR2R2SSL/TLS - Upload a certificate bundle with an RSA and ECDSA certificate per custom hostnamehttps://developers.cloudflare.com/changelog/post/2025-02-14-cert-bundling-for-custom-hostnames/https://developers.cloudflare.com/changelog/post/2025-02-14-cert-bundling-for-custom-hostnames/ <p>Cloudflare has supported both RSA and ECDSA certificates across our platform for a number of years. Both certificates offer the same security, but ECDSA is more performant due to a smaller key size. However, RSA is more widely adopted and ensures compatibility with legacy clients. Instead of choosing between them, you may want both – that way, ECDSA is used when clients support it, but RSA is available if not.</p> <p>Now, you can upload both an RSA and ECDSA certificate on a custom hostname via the API.</p> <figure class="nb-code-figure" data-nb-lang="plaintext"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="plaintext" data-nb-lang="plaintext"><code><span class="line"><span class="nb-shiki-wvjl67">curl -X POST https://api.cloudflare.com/client/v4/zones/$ZONE_ID/custom_hostnames \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -H 'Content-Type: application/json' \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -H "X-Auth-Key: $CLOUDFLARE_API_KEY" \</span></span> <span class="line"><span class="nb-shiki-wvjl67"> -d '{</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "hostname": "hostname",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "ssl": {</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "custom_cert_bundle": [</span></span> <span class="line"><span class="nb-shiki-wvjl67"> {</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "custom_certificate": "RSA Cert",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "custom_key": "RSA Key"</span></span> <span class="line"><span class="nb-shiki-wvjl67"> },</span></span> <span class="line"><span class="nb-shiki-wvjl67"> {</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "custom_certificate": "ECDSA Cert",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "custom_key": "ECDSA Key"</span></span> <span class="line"><span class="nb-shiki-wvjl67"> }</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ],</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "bundle_method": "force",</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "wildcard": false,</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "settings": {</span></span> <span class="line"><span class="nb-shiki-wvjl67"> "min_tls_version": "1.0"</span></span> <span class="line"><span class="nb-shiki-wvjl67"> }</span></span> <span class="line"><span class="nb-shiki-wvjl67"> }</span></span> <span class="line"><span class="nb-shiki-wvjl67">}’</span></span></code></pre></figure> <p>You can also:</p> <ul> <li> <p><a href="https://developers.cloudflare.com/api/resources/custom_hostnames/methods/create/">Upload</a> an RSA or ECDSA certificate to a custom hostname with an existing ECDSA or RSA certificate, respectively.</p> </li> <li> <p><a href="https://developers.cloudflare.com/api/resources/custom_hostnames/subresources/certificate_pack/subresources/certificates/methods/update/">Replace</a> the RSA or ECDSA certificate with a certificate of its same type.</p> </li> <li> <p><a href="https://developers.cloudflare.com/api/resources/custom_hostnames/subresources/certificate_pack/subresources/certificates/methods/delete/">Delete</a> the RSA or ECDSA certificate (if the custom hostname has both an RSA and ECDSA uploaded).</p> </li> </ul> <p>This feature is available for Business and Enterprise customers who have purchased custom certificates.</p>Fri, 14 Feb 2025 00:00:00 GMTSSL/TLSSSL/TLSStream - Rewind, Replay, Resume: Introducing DVR for Stream Livehttps://developers.cloudflare.com/changelog/post/2025-02-14-introducing-dvr-for-stream-live/https://developers.cloudflare.com/changelog/post/2025-02-14-introducing-dvr-for-stream-live/<p>Previously, all viewers watched "the live edge," or the latest content of the broadcast, synchronously. If a viewer paused for more than a few seconds, the player would automatically "catch up" when playback started again. Seeking through the broadcast was only available once the recording was available after it concluded.</p> <p>Starting today, customers can make a small adjustment to the player embed or manifest URL to enable the DVR experience for their viewers. By offering this feature as an opt-in adjustment, our customers are empowered to pick the best experiences for their applications.</p> <p>When building a player embed code or manifest URL, just add <code>dvrEnabled=true</code> as a query parameter. There are some things to be aware of when using this option. For more information, refer to <a href="https://developers.cloudflare.com/stream/stream-live/dvr-for-live/">DVR for Live</a>.</p>Fri, 14 Feb 2025 00:00:00 GMTStreamStreamCache - Configurable multiplexing HTTP/2 to Originhttps://developers.cloudflare.com/changelog/post/2025-02-12-configurable-multiplexing-http2-to-origin/https://developers.cloudflare.com/changelog/post/2025-02-12-configurable-multiplexing-http2-to-origin/<p>You can now configure HTTP/2 multiplexing settings for origin connections on Enterprise plans. This feature allows you to optimize how Cloudflare manages concurrent requests over HTTP/2 connections to your origin servers, improving cache efficiency and reducing connection overhead.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>HTTP/2 multiplexing allows multiple requests to be sent over a single TCP connection. With this configuration option, you can:</p> <ol> <li><strong>Control concurrent streams</strong>: Adjust the maximum number of concurrent streams per connection.</li> <li><strong>Optimize connection reuse</strong>: Fine-tune connection pooling behavior for your origin infrastructure.</li> <li><strong>Reduce connection overhead</strong>: Minimize the number of TCP connections required between Cloudflare and your origin.</li> <li><strong>Improve cache performance</strong>: Better connection management can enhance cache fetch efficiency.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Customizable performance</strong>: Tailor multiplexing settings to your origin's capabilities.</li> <li><strong>Reduced latency</strong>: Fewer connection handshakes improve response times.</li> <li><strong>Lower origin load</strong>: More efficient connection usage reduces server resource consumption.</li> <li><strong>Enhanced scalability</strong>: Better connection management supports higher traffic volumes.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Enterprise customers can configure HTTP/2 multiplexing settings in the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare Dashboard<span class="external-link"> ↗</span></a> or through our <a href="https://developers.cloudflare.com/api/">API</a>.</p> <aside role="note" aria-label="Important consideration" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Important consideration</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>This setting needs to be tuned carefully for your origin infrastructure. Setting the concurrent stream limit too high can negatively impact performance by saturating the shared TCP connection and overwhelming server processing capacity, leading to increased latency for individual requests.</p></div></div></aside>Wed, 12 Feb 2025 00:00:00 GMTCacheCacheRules - Increased Cloudflare Rules limitshttps://developers.cloudflare.com/changelog/post/2025-02-12-rules-upgraded-limits/https://developers.cloudflare.com/changelog/post/2025-02-12-rules-upgraded-limits/<p>We have upgraded and streamlined <a href="https://developers.cloudflare.com/rules/">Cloudflare Rules</a> limits across all plans, simplifying rule management and improving scalability for everyone.</p> <p><strong>New limits by product:</strong></p> <ul> <li><a href="https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/">Bulk Redirects</a> <ul> <li>Free: <strong>20</strong> → <strong>10,000</strong> URL redirects across lists</li> <li>Pro: <strong>500</strong> → <strong>25,000</strong> URL redirects across lists</li> <li>Business: <strong>500</strong> → <strong>50,000</strong> URL redirects across lists</li> <li>Enterprise: <strong>10,000</strong> → <strong>1,000,000</strong> URL redirects across lists</li> </ul> </li> <li><a href="https://developers.cloudflare.com/rules/cloud-connector/">Cloud Connector</a> <ul> <li>Free: <strong>5</strong> → <strong>10</strong> connectors</li> <li>Enterprise: <strong>125</strong> → <strong>300</strong> connectors</li> </ul> </li> <li><a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors</a> <ul> <li>Pro: <strong>5</strong> → <strong>25</strong> error assets and rules</li> <li>Business: <strong>20</strong> → <strong>50</strong> error assets and rules</li> <li>Enterprise: <strong>50</strong> → <strong>300</strong> error assets and rules</li> </ul> </li> <li><a href="https://developers.cloudflare.com/rules/snippets/">Snippets</a> <ul> <li>Pro: <strong>10</strong> → <strong>25</strong> code snippets and rules</li> <li>Business: <strong>25</strong> → <strong>50</strong> code snippets and rules</li> <li>Enterprise: <strong>50</strong> → <strong>300</strong> code snippets and rules</li> </ul> </li> <li><a href="https://developers.cloudflare.com/cache/how-to/cache-rules/">Cache Rules</a>, <a href="https://developers.cloudflare.com/rules/configuration-rules/">Configuration Rules</a>, <a href="https://developers.cloudflare.com/rules/compression-rules/">Compression Rules</a>, <a href="https://developers.cloudflare.com/rules/origin-rules/">Origin Rules</a>, <a href="https://developers.cloudflare.com/rules/url-forwarding/single-redirects/">Single Redirects</a>, and <a href="https://developers.cloudflare.com/rules/transform/">Transform Rules</a> <ul> <li>Enterprise: <strong>125</strong> → <strong>300</strong> rules</li> </ul> </li> </ul> <aside role="note" aria-label="Gradual rollout" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Gradual rollout</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Limits are updated gradually. Some customers may still see previous limits until the rollout is fully completed in the first half of 2025.</p></div></div></aside>Wed, 12 Feb 2025 00:00:00 GMTRulesRulesRules - Custom Errors (beta): Stored Assets & Account-level Ruleshttps://developers.cloudflare.com/changelog/post/2025-02-11-custom-errors-beta/https://developers.cloudflare.com/changelog/post/2025-02-11-custom-errors-beta/<p>We're introducing <a href="https://developers.cloudflare.com/rules/custom-errors/">Custom Errors</a> (beta), which builds on our existing Custom Error Responses feature with new asset storage capabilities.</p> <p>This update allows you to store externally hosted error pages on Cloudflare and reference them in custom error rules, eliminating the need to supply inline content.</p> <p>This brings the following new capabilities:</p> <ul> <li><strong>Custom error assets</strong> – Fetch and store external error pages at the edge for use in error responses.</li> <li><strong>Account-Level custom errors</strong> – Define error handling rules and assets at the account level for consistency across multiple zones. Zone-level rules take precedence over account-level ones, and assets are not shared between levels.</li> </ul> <p>You can use Cloudflare API to upload your existing assets for use with Custom Errors:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> "https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_pages/assets"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "name": "maintenance",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "description": "Maintenance template page",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "url": "https://example.com/"</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure> <p>You can then reference the stored asset in a Custom Error rule:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> PUT</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-mdbnqw">"https://api.cloudflare.com/client/v4/zones/{zone_id}/rulesets/phases/http_custom_errors/entrypoint"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "rules": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "action": "serve_error",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "action_parameters": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "asset_name": "maintenance",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content_type": "text/html",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "status_code": 503</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> },</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "enabled": true,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "expression": "http.request.uri.path contains \"error\""</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure>Tue, 11 Feb 2025 00:00:00 GMTRulesRulesWAF - WAF Release - 2025-02-11https://developers.cloudflare.com/changelog/post/2025-02-11-waf-release/https://developers.cloudflare.com/changelog/post/2025-02-11-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="742306889c2e4f6087de6646483b4c26"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...483b4c26</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100708</td><td>Aviatrix Network - Remote Code Execution - CVE:CVE-2024-50603</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="042228dffe0a4f1587da0e737e924ca3"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...7e924ca3</span></button></rule-id></td><td>100709</td><td>Next.js - Remote Code Execution - CVE:CVE-2024-46982</td><td>Log</td><td>Disabled</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="2a12278325464d6682afb53483a7d8ff"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...83a7d8ff</span></button></rule-id></td><td>100710</td><td><p>Progress Software WhatsUp Gold - Directory Traversal - CVE:CVE-2024-12105</p></td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="82ce3424fbe84e9e99d77332baa8eb34"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...baa8eb34</span></button></rule-id></td><td>100711</td><td>WordPress - Remote Code Execution - CVE:CVE-2024-56064</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="5afacd39dcfd42f89a6c43f787f5d34e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...87f5d34e</span></button></rule-id></td><td>100712</td><td>WordPress - Remote Code Execution - CVE:CVE-2024-9047</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="05842b06f0a4415880b58f7fbf72cf8a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...bf72cf8a</span></button></rule-id></td><td>100713</td><td>FortiOS - Auth Bypass - CVE:CVE-2022-40684</td><td>Log</td><td>Block</td><td>This is a New Detection</td></tr></tbody></table>Tue, 11 Feb 2025 00:00:00 GMTWAFWAFEmail security - Open email links with Security Centerhttps://developers.cloudflare.com/changelog/post/2025-02-07-open-links-security-center/https://developers.cloudflare.com/changelog/post/2025-02-07-open-links-security-center/<p>You can now investigate links in emails with Cloudflare Security Center to generate a report containing a myriad of technical details: a phishing scan, SSL certificate data, HTTP request and response data, page performance data, DNS records, what technologies and libraries the page uses, and more.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1118,height=402,format=webp/_astro/Open-Links-Security-Center.b-LJU4YB.png" alt="Open links in Security Center" loading="lazy" decoding="async" width="1118" height="402"> <p>From <strong>Investigation</strong>, go to <strong>View details</strong>, and look for the <strong>Links identified</strong> section. Select <strong>Open in Security Center</strong> next to each link. <strong>Open in Security Center</strong> allows your team to quickly generate a detailed report about the link with no risk to the analyst or your environment.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/investigation/search-email/#open-links">Open links</a>.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Fri, 07 Feb 2025 23:22:49 GMTEmail securityEmail securityWorkers - Create and deploy Workers from Git repositorieshttps://developers.cloudflare.com/changelog/post/2025-02-07-new-ways-to-get-started-on-workers/https://developers.cloudflare.com/changelog/post/2025-02-07-new-ways-to-get-started-on-workers/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3607,height=1312,format=webp/_astro/choose-template-import-repo.Ci4KQPnT.png" alt="Import repo or choose template" loading="lazy" decoding="async" width="3607" height="1312"> <p>You can now create a Worker by:</p> <ul> <li><strong>Importing a Git repository</strong>: Choose an existing Git repo on your GitHub/GitLab account and set up <a href="https://developers.cloudflare.com/workers/ci-cd/builds/configuration/">Workers Builds</a> to deploy your Worker.</li> <li><strong>Deploying a template with Git</strong>: Choose from a brand new selection of production ready <a href="https://github.com/cloudflare/templates" target="_blank" rel="noopener">examples<span class="external-link"> ↗</span></a> to help you get started with popular frameworks like <a href="https://astro.build/" target="_blank" rel="noopener">Astro<span class="external-link"> ↗</span></a>, <a href="https://remix.run/" target="_blank" rel="noopener">Remix<span class="external-link"> ↗</span></a> and <a href="https://nextjs.org/" target="_blank" rel="noopener">Next<span class="external-link"> ↗</span></a> or build stateful applications with Cloudflare resources like <a href="https://developers.cloudflare.com/d1/">D1 databases</a>, <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a> or <a href="https://developers.cloudflare.com/durable-objects/">Durable Objects</a>! When you're ready to deploy, Cloudflare will set up your project by cloning the template to your GitHub/GitLab account, provisioning any required <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">resources</a> and deploying your Worker.</li> </ul> <p>With every push to your chosen branch, Cloudflare will automatically build and deploy your Worker.</p> <p>To get started, go to the <a href="https://dash.cloudflare.com/?to=/:account/workers-and-pages/create" target="_blank" rel="noopener">Workers dashboard<span class="external-link"> ↗</span></a>.</p> <p>These new features are available today in the Cloudflare dashboard to a subset of Cloudflare customers, and will be coming to all customers in the next few weeks. Don't see it in your dashboard, but want early access? Add your Cloudflare Account ID to <a href="https://forms.gle/U1qhkF2snNJDGJJa9" target="_blank" rel="noopener">this form<span class="external-link"> ↗</span></a>.</p>Fri, 07 Feb 2025 00:00:00 GMTWorkersWorkersAI Gateway - Request timeouts and retries with AI Gatewayhttps://developers.cloudflare.com/changelog/post/2025-02-05-aig-request-handling/https://developers.cloudflare.com/changelog/post/2025-02-05-aig-request-handling/<p>AI Gateway adds additional ways to handle requests - <a href="https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-timeouts">Request Timeouts</a> and <a href="https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-retries">Request Retries</a>, making it easier to keep your applications responsive and reliable.</p> <p>Timeouts and retries can be used on both the <a href="https://developers.cloudflare.com/ai-gateway/usage/universal/">Universal Endpoint</a> or directly to a <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/">supported provider</a>.</p> <p><strong>Request timeouts</strong> A <a href="https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-timeouts">request timeout</a> allows you to trigger <a href="https://developers.cloudflare.com/ai-gateway/configuration/fallbacks/">fallbacks</a> or a retry if a provider takes too long to respond.</p> <p>To set a request timeout directly to a provider, add a <code>cf-aig-request-timeout</code> header.</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Provider-specific endpoint example</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/workers-ai/@cf/meta/llama-3.1-8b-instruct</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer {cf_api_token}'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Content-Type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line highlighted"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'cf-aig-request-timeout: 5000'</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> --data</span><span class="nb-shiki-mdbnqw"> '{"prompt": "What is Cloudflare?"}'</span></span></code></pre></figure> <p><strong>Request retries</strong> A <a href="https://developers.cloudflare.com/ai-gateway/configuration/request-handling/#request-retries">request retry</a> automatically retries failed requests, so you can recover from temporary issues without intervening.</p> <p>To set up request retries directly to a provider, add the following headers:</p> <ul> <li>cf-aig-max-attempts (number)</li> <li>cf-aig-retry-delay (number)</li> <li>cf-aig-backoff ("constant" | "linear" | "exponential)</li> </ul>Thu, 06 Feb 2025 00:00:00 GMTAI GatewayAI GatewayAI Gateway - AI Gateway adds Cerebras, ElevenLabs, and Cartesia as new providershttps://developers.cloudflare.com/changelog/post/2025-02-04-aig-provider-cartesia-eleven-cerebras/https://developers.cloudflare.com/changelog/post/2025-02-04-aig-provider-cartesia-eleven-cerebras/<p><a href="https://developers.cloudflare.com/ai-gateway/">AI Gateway</a> has added three new providers: <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/cartesia/">Cartesia</a>, <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/">Cerebras</a>, and <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/elevenlabs/">ElevenLabs</a>, giving you more even more options for providers you can use through AI Gateway. Here's a brief overview of each:</p> <ul> <li><a href="https://developers.cloudflare.com/ai-gateway/usage/providers/cartesia/">Cartesia</a> provides text-to-speech models that produce natural-sounding speech with low latency.</li> <li><a href="https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/">Cerebras</a> delivers low-latency AI inference to Meta's Llama 3.1 8B and Llama 3.3 70B models.</li> <li><a href="https://developers.cloudflare.com/ai-gateway/usage/providers/elevenlabs/">ElevenLabs</a> offers text-to-speech models with human-like voices in 32 languages.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2278,height=1020,format=webp/_astro/cerebras2.qHYP0ZnF.png" alt="Example of Cerebras log in AI Gateway" loading="lazy" decoding="async" width="2278" height="1020"> <p>To get started with AI Gateway, just update the base URL. Here's how you can send a request to <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/cerebras/">Cerebras</a> using cURL:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example fetch request</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> -X</span><span class="nb-shiki-mdbnqw"> POST</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/ACCOUNT_TAG/GATEWAY/cerebras/chat/completions</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'content-type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer CEREBRAS_TOKEN'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "model": "llama-3.3-70b",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "What is Cloudflare?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure>Wed, 05 Feb 2025 00:00:00 GMTAI GatewayAI GatewayCache - Fight CSAM More Easily Than Everhttps://developers.cloudflare.com/changelog/post/2025-02-04-easier-onboarding-for-csam-scanning-tool/https://developers.cloudflare.com/changelog/post/2025-02-04-easier-onboarding-for-csam-scanning-tool/<p>You can now implement our <strong>child safety tooling</strong>, the <strong><a href="https://developers.cloudflare.com/cache/reference/csam-scanning/">CSAM Scanning Tool</a></strong>, more easily. Instead of requiring external reporting credentials, you only need a verified email address for notifications to onboard. This change makes the tool more accessible to a wider range of customers.</p> <p><strong>How It Works</strong></p> <p>When enabled, the tool automatically <a href="https://blog.cloudflare.com/the-csam-scanning-tool/" target="_blank" rel="noopener">hashes images for enabled websites as they enter the Cloudflare cache<span class="external-link"> ↗</span></a>. These hashes are then checked against a database of <strong>known abusive images</strong>.</p> <ul> <li><strong>Potential match detected?</strong> <ul> <li>The <strong>content URL is blocked</strong>, and</li> <li><strong>Cloudflare will notify you</strong> about the found matches via the provided email address.</li> </ul> </li> </ul> <p><strong>Updated Service-Specific Terms</strong></p> <p>We have also made updates to our <strong><a href="https://www.cloudflare.com/service-specific-terms-application-services/#csam-scanning-tool-terms" target="_blank" rel="noopener">Service-Specific Terms<span class="external-link"> ↗</span></a></strong> to reflect these changes.</p>Tue, 04 Feb 2025 00:00:00 GMTCacheCacheRadar - Expanded AI insights in Cloudflare Radarhttps://developers.cloudflare.com/changelog/post/2025-02-04-radar-ai-insights/https://developers.cloudflare.com/changelog/post/2025-02-04-radar-ai-insights/<p><a href="https://developers.cloudflare.com/radar/"><strong>Radar</strong></a> has expanded its AI insights with new API endpoints for Internet services rankings, robots.txt analysis, and AI inference data.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="internet-services-ranking">Internet services ranking</h4><a class="anchor-link" href="#internet-services-ranking"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Radar now provides <a href="https://developers.cloudflare.com/radar/glossary/#internet-services-ranking">rankings for Internet services</a>, including Generative AI platforms, based on anonymized 1.1.1.1 resolver data. Previously limited to the annual Year in Review, these insights are now available daily via the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/ranking/subresources/internet_services/">API</a>, through the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ranking/subresources/internet_services/methods/top/"><code>/ranking/internet_services/top</code></a> show service popularity at a specific date.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ranking/subresources/internet_services/methods/timeseries_groups/"><code>/ranking/internet_services/timeseries_groups</code></a> track ranking trends over time.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="robotstxt">Robots.txt</h4><a class="anchor-link" href="#robotstxt"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Radar now analyzes <a href="https://developers.cloudflare.com/radar/glossary/#robotstxt">robots.txt</a> files from the top 10,000 domains, identifying AI bot access rules. AI-focused user agents from <a href="https://github.com/ai-robots-txt/ai.robots.txt" target="_blank" rel="noopener">ai.robots.txt<span class="external-link"> ↗</span></a> are categorized as:</p> <ul> <li><strong>Fully allowed/disallowed</strong> if directives apply to all paths (<code>*</code>).</li> <li><strong>Partially allowed/disallowed</strong> if restrictions apply to specific paths.</li> </ul> <p>These insights are now available weekly via the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/robots_txt/">API</a>, through the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/robots_txt/subresources/top/subresources/user_agents/methods/directive/"><code>/robots_txt/top/user_agents/directive</code></a> to get the top AI user agents by directive.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/robots_txt/subresources/top/methods/domain_categories/"><code>/robots_txt/top/domain_categories</code></a> to get the top domain categories by robots.txt files.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="workers-ai">Workers AI</h4><a class="anchor-link" href="#workers-ai"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Radar now provides insights into public AI inference models from <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>, tracking usage trends across <strong>models</strong> and <strong>tasks</strong>. These insights are now available via the <a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/">API</a>, through the following endpoints:</p> <ul> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/subresources/summary/"><code>/ai/inference/summary/{dimension}</code></a> to view aggregated <code>model</code> and <code>task</code> popularity.</li> <li><a href="https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/subresources/timeseries_groups/"><code>/ai/inference/timeseries_groups/{dimension}</code></a> to track changes over time for <code>model</code> or <code>task</code>.</li> </ul> <p>Learn more about the new Radar AI insights in our <a href="https://blog.cloudflare.com/expanded-ai-insights-on-cloudflare-radar/" target="_blank" rel="noopener">blog post<span class="external-link"> ↗</span></a>.</p>Tue, 04 Feb 2025 00:00:00 GMTRadarRadarWAF - Updated leaked credentials databasehttps://developers.cloudflare.com/changelog/post/2025-02-04-updated-leaked-credentials-database/https://developers.cloudflare.com/changelog/post/2025-02-04-updated-leaked-credentials-database/<p>Added new records to the leaked credentials database from a third-party database.</p>Tue, 04 Feb 2025 00:00:00 GMTWAFWAFData Loss Prevention, Gateway - Block files that are password-protected, compressed, or otherwise unscannable.https://developers.cloudflare.com/changelog/post/2025-02-13-improvements-unscannable-files/https://developers.cloudflare.com/changelog/post/2025-02-13-improvements-unscannable-files/ <p>Gateway HTTP policies can now block files that are password-protected, compressed, or otherwise unscannable.</p> <p>These unscannable files are now matched with the <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#download-and-upload-file-types">Download and Upload File Types traffic selectors</a> for HTTP policies:</p> <ul> <li>Password-protected Microsoft Office document</li> <li>Password-protected PDF</li> <li>Password-protected ZIP archive</li> <li>Unscannable ZIP archive</li> </ul> <p>To get started inspecting and modifying behavior based on these and other rules, refer to <a href="https://developers.cloudflare.com/cloudflare-one/traffic-policies/get-started/http/">HTTP filtering</a>.</p>Mon, 03 Feb 2025 00:00:00 GMTData Loss PreventionData Loss PreventionGatewayCloudflare Fundamentals, Terraform - Terraform v5 Provider is now generally availablehttps://developers.cloudflare.com/changelog/post/2025-02-03-terraform-v5-provider/https://developers.cloudflare.com/changelog/post/2025-02-03-terraform-v5-provider/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1330,height=296,format=webp/_astro/2024-02-03-terraform-v5-screenshot.mW8OaFoS.png" alt="Screenshot of Terraform defining a Zone" loading="lazy" decoding="async" width="1330" height="296"> <p>Cloudflare's v5 Terraform Provider is now generally available. With this release, Terraform resources are now automatically generated based on OpenAPI Schemas. This change brings alignment across our SDKs, API documentation, and now Terraform Provider. The new provider boosts coverage by increasing support for API properties to 100%, adding 25% more resources, and more than 200 additional data sources. Going forward, this will also reduce the barriers to bringing more resources into Terraform across the broader Cloudflare API. This is a small, but important step to making more of our platform manageable through GitOps, making it easier for you to manage Cloudflare just like you do your other infrastructure.</p> <p>The Cloudflare Terraform Provider v5 is a ground-up rewrite of the provider and introduces breaking changes for some resource types. Please refer to the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade" target="_blank" rel="noopener">upgrade guide<span class="external-link"> ↗</span></a> for best practices, or the <a href="https://blog.cloudflare.com/automatically-generating-cloudflares-terraform-provider/" target="_blank" rel="noopener">blog post on automatically generating Cloudflare's Terraform Provider<span class="external-link"> ↗</span></a> for more information about the approach.</p> <p>For more info</p> <ul> <li><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" target="_blank" rel="noopener">Terraform provider<span class="external-link"> ↗</span></a></li> <li><a href="https://developers.cloudflare.com/terraform/" target="_blank" rel="noopener">Documentation on using Terraform with Cloudflare<span class="external-link"> ↗</span></a></li> </ul>Mon, 03 Feb 2025 00:00:00 GMTCloudflare FundamentalsCloudflare FundamentalsTerraformWorkers - Revamped Workers Metricshttps://developers.cloudflare.com/changelog/post/2025-02-03-workers-metrics-revamp/https://developers.cloudflare.com/changelog/post/2025-02-03-workers-metrics-revamp/<p>We've revamped the <a href="https://dash.cloudflare.com/?to=/:account/workers/services/view/:worker/production/metrics/" target="_blank" rel="noopener">Workers Metrics dashboard<span class="external-link"> ↗</span></a>.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3032,height=1756,format=webp/_astro/workers-metrics.IxYk9yF0.png" alt="Workers Metrics dashboard" loading="lazy" decoding="async" width="3032" height="1756"> <p>Now you can easily compare metrics across Worker versions, understand the current state of a <a href="https://developers.cloudflare.com/workers/versions-and-deployments/gradual-deployments/">gradual deployment</a>, and review key Workers metrics in a single view. This new interface enables you to:</p> <ul> <li>Drag-and-select using a graphical timepicker for precise metric selection.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1944,height=932,format=webp/_astro/metrics-graphical-timepicker.tzLlEF5U.png" alt="Workers Metrics graphical timepicker" loading="lazy" decoding="async" width="1944" height="932"> <ul> <li>Use histograms to visualize cumulative metrics, allowing you to bucket and compare rates over time.</li> <li>Focus on Worker versions by directly interacting with the version numbers in the legend.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2308,height=1068,format=webp/_astro/metrics-legend-selector.B2GY90Hn.png" alt="Workers Metrics legend selector" loading="lazy" decoding="async" width="2308" height="1068"> <ul> <li>Monitor and compare active gradual deployments.</li> <li>Track error rates across versions with grouping both by version and by invocation status.</li> <li>Measure how <a href="https://developers.cloudflare.com/workers/configuration/placement/">Smart Placement</a> improves request duration.</li> </ul> <p>Learn more about <a href="https://developers.cloudflare.com/workers/observability/metrics-and-analytics">metrics</a>.</p>Mon, 03 Feb 2025 00:00:00 GMTWorkersWorkersDNS - Removed unused meta fields from DNS recordshttps://developers.cloudflare.com/changelog/post/2025-02-02-removed-meta-fields/https://developers.cloudflare.com/changelog/post/2025-02-02-removed-meta-fields/<p>Cloudflare is removing five fields from the <code>meta</code> object of DNS records. These fields have been unused for more than a year and are no longer set on new records. This change may take up to four weeks to fully roll out.</p> <p>The affected fields are:</p> <ul> <li>the <code>auto_added</code> boolean</li> <li>the <code>managed_by_apps</code> boolean and corresponding <code>apps_install_id</code></li> <li>the <code>managed_by_argo_tunnel</code> boolean and corresponding <code>argo_tunnel_id</code></li> </ul> <p>An example record returned from the API would now look like the following:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="json"><figcaption class="nb-code-title"><span class="nb-code-title-name">Updated API Response</span><span class="nb-code-title-lang">json</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "result"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;ID&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "zone_id"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"&lt;ZONE_ID&gt;"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "zone_name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "name"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"www.example.com"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"A"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "content"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"192.0.2.1"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "proxiable"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "proxied"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "ttl"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">1</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "locked"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "meta"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line diff remove"><span class="nb-shiki-dzsirb"> "auto_added"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff remove"><span class="nb-shiki-dzsirb"> "managed_by_apps"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line diff remove"><span class="nb-shiki-dzsirb"> "managed_by_argo_tunnel"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "source"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"primary"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "comment"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">null</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "tags"</span><span class="nb-shiki-140thh">: [],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "created_on"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-03-17T20:37:05.368097Z"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "modified_on"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"2025-03-17T20:37:05.368097Z"</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "success"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-dzsirb">true</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "errors"</span><span class="nb-shiki-140thh">: [],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "messages"</span><span class="nb-shiki-140thh">: []</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>For more guidance, refer to <a href="https://developers.cloudflare.com/dns/manage-dns-records/">Manage DNS records</a>.</p>Sun, 02 Feb 2025 00:00:00 GMTDNSDNSWorkers for Platforms - Workers for Platforms now supports Static Assetshttps://developers.cloudflare.com/changelog/post/2025-01-31-workers-platforms-static-assets/https://developers.cloudflare.com/changelog/post/2025-01-31-workers-platforms-static-assets/ <p>Workers for Platforms customers can now attach static assets (HTML, CSS, JavaScript, images) directly to User Workers, removing the need to host separate infrastructure to serve the assets.</p> <p>This allows your platform to serve entire front-end applications from Cloudflare's global edge, utilizing caching for fast load times, while supporting dynamic logic within the same Worker. Cloudflare automatically scales its infrastructure to handle high traffic volumes, enabling you to focus on building features without managing servers.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="what-you-can-build">What you can build</h4><a class="anchor-link" href="#what-you-can-build"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p><strong>Static Sites:</strong> Host and serve HTML, CSS, JavaScript, and media files directly from Cloudflare's network, ensuring fast loading times worldwide. This is ideal for blogs, landing pages, and documentation sites because static assets can be efficiently cached and delivered closer to the user, reducing latency and enhancing the overall user experience.</p> <p><strong>Full-Stack Applications:</strong> Combine asset hosting with Cloudflare Workers to power dynamic, interactive applications. If you're an e-commerce platform, you can serve your customers' product pages and run inventory checks from within the same Worker.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> url</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Check real-time inventory</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (url.pathname </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> "/api/inventory/check"</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> product</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> url.searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"product"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> inventory</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">INVENTORY_KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(product);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(inventory);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Serve static assets (HTML, CSS, images)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">ASSETS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> url</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> URL</span><span class="nb-shiki-140thh">(request.url);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Check real-time inventory</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (url.pathname </span><span class="nb-shiki-1itgoe">===</span><span class="nb-shiki-mdbnqw"> '/api/inventory/check'</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> product</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> url.searchParams.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'product'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> inventory</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">INVENTORY_KV</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(product);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(inventory);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Serve static assets (HTML, CSS, images)</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">ASSETS</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p><strong>Get Started:</strong> Upload static assets using the Workers for Platforms API or Wrangler. For more information, visit our <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/static-assets/" target="_blank" rel="noopener">Workers for Platforms documentation.<span class="external-link"> ↗</span></a></p>Fri, 31 Jan 2025 00:00:00 GMTWorkers for PlatformsWorkers for PlatformsWorkers - Transform HTML quickly with streaming contenthttps://developers.cloudflare.com/changelog/post/2025-01-31-html-rewriter-streaming/https://developers.cloudflare.com/changelog/post/2025-01-31-html-rewriter-streaming/ <p>You can now transform HTML elements with streamed content using <a href="https://developers.cloudflare.com/workers/runtime-apis/html-rewriter"><code>HTMLRewriter</code></a>.</p> <p>Methods like <code>replace</code>, <code>append</code>, and <code>prepend</code> now accept <a href="https://developers.cloudflare.com/workers/runtime-apis/response/"><code>Response</code></a> and <a href="https://developers.cloudflare.com/workers/runtime-apis/streams/readablestream/"><code>ReadableStream</code></a> values as <a href="https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/#global-types"><code>Content</code></a>.</p> <p>This can be helpful in a variety of situations. For instance, you may have a Worker in front of an origin, and want to replace an element with content from a different source. Prior to this change, you would have to load all of the content from the upstream URL and convert it into a string before replacing the element. This slowed down overall response times.</p> <p>Now, you can pass the <code>Response</code> object directly into the <code>replace</code> method, and HTMLRewriter will immediately start replacing the content as it is streamed in. This makes responses faster.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> ElementRewriter</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> element</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">element</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // able to replace elements while streaming content</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // the fetched body is not buffered into memory as part</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // of the replace</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> res </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://upstream-content-provider.example"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> element.</span><span class="nb-shiki-1t8gfj">replace</span><span class="nb-shiki-140thh">(res);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> response </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://site-to-replace.com"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> HTMLRewriter</span><span class="nb-shiki-140thh">()</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"[data-to-replace]"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> ElementRewriter</span><span class="nb-shiki-140thh">())</span></span> <span class="line"><span class="nb-shiki-140thh"> .</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">(response);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">class</span><span class="nb-shiki-1t8gfj"> ElementRewriter</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> element</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">element</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> any</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // able to replace elements while streaming content</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // the fetched body is not buffered into memory as part</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // of the replace</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> res </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'https://upstream-content-provider.example'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> element.</span><span class="nb-shiki-1t8gfj">replace</span><span class="nb-shiki-140thh">(res);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> let</span><span class="nb-shiki-140thh"> response </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'https://site-to-replace.com'</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> HTMLRewriter</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">on</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'[data-to-replace]'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> ElementRewriter</span><span class="nb-shiki-140thh">()).</span><span class="nb-shiki-1t8gfj">transform</span><span class="nb-shiki-140thh">(response);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">>;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>For more information, see the <a href="https://developers.cloudflare.com/workers/runtime-apis/html-rewriter"><code>HTMLRewriter</code> documentation</a>.</p>Fri, 31 Jan 2025 00:00:00 GMTWorkersWorkersAI Gateway - AI Gateway Introduces New Worker Binding Methodshttps://developers.cloudflare.com/changelog/post/2025-01-26-worker-binding-methods/https://developers.cloudflare.com/changelog/post/2025-01-26-worker-binding-methods/<p>We have released new <a href="https://developers.cloudflare.com/ai-gateway/usage/worker-binding-methods/">Workers bindings API methods</a>, allowing you to connect Workers applications to AI Gateway directly. These methods simplify how Workers calls AI services behind your AI Gateway configurations, removing the need to use the REST API and manually authenticate.</p> <p>To add an AI binding to your Worker, include the following in your <a href="https://developers.cloudflare.com/workers/wrangler/configuration/">Wrangler configuration file</a>:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=754,height=135,format=webp/_astro/add-binding.BoYTiyon.png" alt="Add an AI binding to your Worker." loading="lazy" decoding="async" width="754" height="135"> <p>With the new AI Gateway binding methods, you can now:</p> <ul> <li>Send feedback and update metadata with <code>patchLog</code>.</li> <li>Retrieve detailed log information using <code>getLog</code>.</li> <li>Execute <a href="https://developers.cloudflare.com/ai-gateway/usage/universal/">universal requests</a> to any AI Gateway provider with <code>run</code>.</li> </ul> <p>For example, to send feedback and update metadata using <code>patchLog</code>:</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=736,height=235,format=webp/_astro/send-feedback.BGRzKmd9.png" alt="Send feedback and update metadata using patchLog:" loading="lazy" decoding="async" width="736" height="235">Thu, 30 Jan 2025 00:00:00 GMTAI GatewayAI GatewayWorkers, Browser Run - Increased Browser Rendering limits!https://developers.cloudflare.com/changelog/post/2025-01-30-browser-rendering-more-instances/https://developers.cloudflare.com/changelog/post/2025-01-30-browser-rendering-more-instances/ <p><a href="https://developers.cloudflare.com/browser-run/">Browser Rendering</a> now supports 10 concurrent browser instances per account <em>and</em> 10 new instances per minute, up from the previous limits of 2.</p> <p>This allows you to launch more browser tasks from <a href="https://developers.cloudflare.com/workers">Cloudflare Workers</a>.</p> <p>To manage concurrent browser sessions, you can use <a href="https://developers.cloudflare.com/queues/">Queues</a> or <a href="https://developers.cloudflare.com/workflows/">Workflows</a>:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> queue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">batch</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> message</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> batch.messages) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> browser</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> puppeteer.</span><span class="nb-shiki-1t8gfj">launch</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> page</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">newPage</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">goto</span><span class="nb-shiki-140thh">(message.url, {</span></span> <span class="line"><span class="nb-shiki-140thh"> waitUntil: message.waitUntil,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Process page...</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">interface</span><span class="nb-shiki-1t8gfj"> QueueMessage</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> url</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> waitUntil</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> number</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> interface</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1jdh33"> BROWSER_QUEUE</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Queue</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">QueueMessage</span><span class="nb-shiki-140thh">>;</span></span> <span class="line"><span class="nb-shiki-1jdh33"> BROWSER</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Fetcher</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> queue</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">batch</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> MessageBatch</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">QueueMessage</span><span class="nb-shiki-140thh">>, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-dzsirb">void</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> for</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> message</span><span class="nb-shiki-1itgoe"> of</span><span class="nb-shiki-140thh"> batch.messages) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> browser</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> puppeteer.</span><span class="nb-shiki-1t8gfj">launch</span><span class="nb-shiki-140thh">(env.</span><span class="nb-shiki-dzsirb">BROWSER</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> page</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">newPage</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> page.</span><span class="nb-shiki-1t8gfj">goto</span><span class="nb-shiki-140thh">(message.url, {</span></span> <span class="line"><span class="nb-shiki-140thh"> waitUntil: message.waitUntil,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Process page...</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> browser.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div>Thu, 30 Jan 2025 00:00:00 GMTWorkersWorkersBrowser RunStream - Expanded language support for Stream AI Generated Captionshttps://developers.cloudflare.com/changelog/post/2025-01-30-stream-generated-captions-new-languages/https://developers.cloudflare.com/changelog/post/2025-01-30-stream-generated-captions-new-languages/<p>Stream's <a href="https://developers.cloudflare.com/stream/edit-videos/adding-captions/#generate-a-caption">generated captions</a> leverage Workers AI to automatically transcribe audio and provide captions to the player experience. We have added support for these languages:</p> <ul> <li><code>cs</code> - Czech</li> <li><code>nl</code> - Dutch</li> <li><code>fr</code> - French</li> <li><code>de</code> - German</li> <li><code>it</code> - Italian</li> <li><code>ja</code> - Japanese</li> <li><code>ko</code> - Korean</li> <li><code>pl</code> - Polish</li> <li><code>pt</code> - Portuguese</li> <li><code>ru</code> - Russian</li> <li><code>es</code> - Spanish</li> </ul> <p>For more information, learn about <a href="https://developers.cloudflare.com/stream/edit-videos/adding-captions/">adding captions to videos</a>.</p>Thu, 30 Jan 2025 00:00:00 GMTStreamStreamRules - New Snippets Code Editorhttps://developers.cloudflare.com/changelog/post/2025-01-29-snippets-code-editor/https://developers.cloudflare.com/changelog/post/2025-01-29-snippets-code-editor/<p>The new <a href="https://developers.cloudflare.com/rules/snippets/">Snippets</a> code editor lets you edit Snippet code and rule in one place, making it easier to test and deploy changes without switching between pages.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3446,height=1690,format=webp/_astro/snippets-new-editor.CaoIu2_-.png" alt="New Snippets code editor" loading="lazy" decoding="async" width="3446" height="1690"> <p>What’s new:</p> <ul> <li><strong>Single-page editing for code and rule</strong> – No need to jump between screens.</li> <li><strong>Auto-complete &amp; syntax highlighting</strong> – Get suggestions and avoid mistakes.</li> <li><strong>Code formatting &amp; refactoring</strong> – Write cleaner, more readable code.</li> </ul> <p>Try it now in <a href="https://dash.cloudflare.com/?to=/:account/:zone/rules/snippets" target="_blank" rel="noopener">Rules &gt; Snippets<span class="external-link"> ↗</span></a>.</p>Wed, 29 Jan 2025 00:00:00 GMTRulesRulesHyperdrive - Automatic configuration for private databases on Hyperdrivehttps://developers.cloudflare.com/changelog/post/2025-01-28-hyperdrive-automated-private-database-configuration/https://developers.cloudflare.com/changelog/post/2025-01-28-hyperdrive-automated-private-database-configuration/<p>Hyperdrive now automatically configures your Cloudflare Tunnel to connect to your private database.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1814,height=922,format=webp/_astro/hyperdrive-private-database-automatic-configuration.BT4_KLwW.png" alt="Automatic configuration of Cloudflare Access and Service Token in the Cloudflare dashboard for Hyperdrive." loading="lazy" decoding="async" width="1814" height="922"> <p>When creating a Hyperdrive configuration for a private database, you only need to provide your database credentials and set up a Cloudflare Tunnel within the private network where your database is accessible. Hyperdrive will automatically create the Cloudflare Access, Service Token, and Policies needed to secure and restrict your Cloudflare Tunnel to the Hyperdrive configuration.</p> <p>To create a Hyperdrive for a private database, you can follow the <a href="https://developers.cloudflare.com/hyperdrive/configuration/connect-to-private-database/">Hyperdrive documentation</a>. You can still manually create the Cloudflare Access, Service Token, and Policies if you prefer.</p> <p>This feature is available from the Cloudflare dashboard.</p>Tue, 28 Jan 2025 00:00:00 GMTHyperdriveHyperdriveKV - Workers KV namespace limits increased to 1000https://developers.cloudflare.com/changelog/post/2025-01-27-kv-increased-namespaces-limits/https://developers.cloudflare.com/changelog/post/2025-01-27-kv-increased-namespaces-limits/<p>You can now have up to 1000 Workers KV namespaces per account.</p> <p>Workers KV namespace limits were increased from 200 to 1000 for all accounts. Higher limits for Workers KV namespaces enable better organization of key-value data, such as by category, tenant, or environment.</p> <p>Consult the <a href="https://developers.cloudflare.com/kv/platform/limits/">Workers KV limits documentation</a> for the rest of the limits. This increased limit is available for both the Free and Paid <a href="https://developers.cloudflare.com/workers/platform/pricing/">Workers plans</a>.</p>Tue, 28 Jan 2025 00:00:00 GMTKVKVWorkers - Support for Node.js DNS, Net, and Timer APIs in Workershttps://developers.cloudflare.com/changelog/post/2025-01-28-nodejs-compat-improvements/https://developers.cloudflare.com/changelog/post/2025-01-28-nodejs-compat-improvements/ <p>When using a Worker with the <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/"><code>nodejs_compat</code></a> compatibility flag enabled, you can now use the following Node.js APIs:</p> <ul> <li><a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/net/"><code>node:net</code></a></li> <li><a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/dns/"><code>node:dns</code></a></li> <li><a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/timers/"><code>node:timers</code></a></li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nodenet">node:net</h4><a class="anchor-link" href="#nodenet"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can use <a href="https://nodejs.org/api/net.html" target="_blank" rel="noopener"><code>node:net</code><span class="external-link"> ↗</span></a> to create a direct connection to servers via a TCP sockets with <a href="https://nodejs.org/api/net.html#class-netsocket" target="_blank" rel="noopener"><code>net.Socket</code><span class="external-link"> ↗</span></a>.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> net </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:net"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> exampleIP</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "127.0.0.1"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> socket</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-140thh"> net.</span><span class="nb-shiki-1t8gfj">Socket</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">4000</span><span class="nb-shiki-140thh">, exampleIP, </span><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-140thh"> () {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Connected"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Hello, Server!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Wrote to server"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">200</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> net </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:net"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> exampleIP</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "127.0.0.1"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> socket</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-140thh"> net.</span><span class="nb-shiki-1t8gfj">Socket</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-dzsirb">4000</span><span class="nb-shiki-140thh">, exampleIP, </span><span class="nb-shiki-1itgoe">function</span><span class="nb-shiki-140thh"> () {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Connected"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Hello, Server!"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> socket.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Wrote to server"</span><span class="nb-shiki-140thh">, { status: </span><span class="nb-shiki-dzsirb">200</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">;</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Additionally, you can now use other APIs including <a href="https://nodejs.org/api/net.html#class-netblocklist" target="_blank" rel="noopener"><code>net.BlockList</code><span class="external-link"> ↗</span></a> and <a href="https://nodejs.org/api/net.html#class-netsocketaddress" target="_blank" rel="noopener"><code>net.SocketAddress</code><span class="external-link"> ↗</span></a>.</p> <p>Note that <a href="https://nodejs.org/api/net.html#class-netserver" target="_blank" rel="noopener"><code>net.Server</code><span class="external-link"> ↗</span></a> is not supported.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nodedns">node:dns</h4><a class="anchor-link" href="#nodedns"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can use <a href="https://nodejs.org/api/dns.html" target="_blank" rel="noopener"><code>node:dns</code><span class="external-link"> ↗</span></a> for name resolution via <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/">DNS over HTTPS</a> using <a href="https://www.cloudflare.com/application-services/products/dns/" target="_blank" rel="noopener">Cloudflare DNS<span class="external-link"> ↗</span></a> at 1.1.1.1.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> dns </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:dns"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">let</span><span class="nb-shiki-140thh"> response </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> dns.promises.</span><span class="nb-shiki-1t8gfj">resolve4</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"cloudflare.com"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"NS"</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> dns </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> 'node:dns'</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">let</span><span class="nb-shiki-140thh"> response </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> dns.promises.</span><span class="nb-shiki-1t8gfj">resolve4</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">'cloudflare.com'</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">'NS'</span><span class="nb-shiki-140thh">);</span></span></code></pre></figure></div></div></div></div> <p>All <code>node:dns</code> functions are available, except <code>lookup</code>, <code>lookupService</code>, and <code>resolve</code> which throw "Not implemented" errors when called.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="nodetimers">node:timers</h4><a class="anchor-link" href="#nodetimers"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can use <a href="https://nodejs.org/api/timers.html" target="_blank" rel="noopener"><code>node:timers</code><span class="external-link"> ↗</span></a> to schedule functions to be called at some future period of time.</p> <p>This includes <a href="https://nodejs.org/api/timers.html#settimeoutcallback-delay-args" target="_blank" rel="noopener"><code>setTimeout</code><span class="external-link"> ↗</span></a> for calling a function after a delay, <a href="https://nodejs.org/api/timers.html#setintervalcallback-delay-args" target="_blank" rel="noopener"><code>setInterval</code><span class="external-link"> ↗</span></a> for calling a function repeatedly, and <a href="https://nodejs.org/api/timers.html#setimmediatecallback-args" target="_blank" rel="noopener"><code>setImmediate</code><span class="external-link"> ↗</span></a> for calling a function in the next iteration of the event loop.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> timers </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:timers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"first"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">timers.</span><span class="nb-shiki-1t8gfj">setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"last"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">}, </span><span class="nb-shiki-dzsirb">10</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">timers.</span><span class="nb-shiki-1t8gfj">setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"next"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> timers </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "node:timers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"first"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">timers.</span><span class="nb-shiki-1t8gfj">setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"last"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">}, </span><span class="nb-shiki-dzsirb">10</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">timers.</span><span class="nb-shiki-1t8gfj">setTimeout</span><span class="nb-shiki-140thh">(() </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> console.</span><span class="nb-shiki-1t8gfj">log</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"next"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div>Tue, 28 Jan 2025 00:00:00 GMTWorkersWorkersWAF - WAF Release - 2025-01-21https://developers.cloudflare.com/changelog/post/2025-01-21-waf-release/https://developers.cloudflare.com/changelog/post/2025-01-21-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f4a310393c564d50bd585601b090ba9a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b090ba9a</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100303</td><td>Command Injection - Nslookup</td><td>Log</td><td>Block</td><td><p>This was released as <rule-id id="aad6f9f85e034022b6a8dee4b8d152f4"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b8d152f4</span></button></rule-id></p></td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="fd5d5678ce594ea898aa9bf149e6b538"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...49e6b538</span></button></rule-id></td><td>100534</td><td>Web Shell Activity</td><td>Log</td><td>Block</td><td><p>This was released as <rule-id id="39c8f6066c19466ea084e51e82fe4e7f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...82fe4e7f</span></button></rule-id></p></td></tr></tbody></table>Tue, 21 Jan 2025 00:00:00 GMTWAFWAFData Loss Prevention - Detect source code leaks with Data Loss Preventionhttps://developers.cloudflare.com/changelog/post/2025-01-03-source-code-confidence-level/https://developers.cloudflare.com/changelog/post/2025-01-03-source-code-confidence-level/ <p>You can now detect source code leaks with Data Loss Prevention (DLP) with predefined checks against common programming languages.</p> <p>The following programming languages are validated with natural language processing (NLP).</p> <ul> <li>C</li> <li>C++</li> <li>C#</li> <li>Go</li> <li>Haskell</li> <li>Java</li> <li>JavaScript</li> <li>Lua</li> <li>Python</li> <li>R</li> <li>Rust</li> <li>Swift</li> </ul> <p>DLP also supports confidence level for <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#source-code">source code profiles</a>.</p> <p>For more details, refer to <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/">DLP profiles</a>.</p>Mon, 20 Jan 2025 00:00:00 GMTData Loss PreventionData Loss PreventionAccess - Export SSH command logs with Access for Infrastructure using Logpushhttps://developers.cloudflare.com/changelog/post/2025-01-15-ssh-logs-and-logpush/https://developers.cloudflare.com/changelog/post/2025-01-15-ssh-logs-and-logpush/<aside role="note" aria-label="Availability" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Availability</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Only available on Enterprise plans.</p></div></div></aside> <p>Cloudflare now allows you to send SSH command logs to storage destinations configured in <a href="https://developers.cloudflare.com/logs/logpush/">Logpush</a>, including third-party destinations. Once exported, analyze and audit the data as best fits your organization! For a list of available data fields, refer to the <a href="https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/ssh_logs/">SSH logs dataset</a>.</p> <p>To set up a Logpush job, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/">Logpush integration</a>.</p>Wed, 15 Jan 2025 00:00:00 GMTAccessAccessWorkflows - Increased Workflows limits and improved instance queueing.https://developers.cloudflare.com/changelog/post/2025-01-15-workflows-more-steps/https://developers.cloudflare.com/changelog/post/2025-01-15-workflows-more-steps/<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> (beta) now allows you to define up to 1024 <a href="https://developers.cloudflare.com/workflows/build/workers-api/#workflowstep">steps</a>. <code>sleep</code> steps do not count against this limit.</p> <p>We've also added:</p> <ul> <li><code>instanceId</code> as property to the <a href="https://developers.cloudflare.com/workflows/build/workers-api/#workflowevent"><code>WorkflowEvent</code></a> type, allowing you to retrieve the current instance ID from within a running Workflow instance</li> <li>Improved queueing logic for Workflow instances beyond the current maximum concurrent instances, reducing the cases where instances are stuck in the queued state.</li> <li>Support for <a href="https://developers.cloudflare.com/workflows/build/workers-api/#pause"><code>pause</code> and <code>resume</code></a> for Workflow instances in a queued state.</li> </ul> <p>We're continuing to work on increases to the number of concurrent Workflow instances, steps, and support for a new <code>waitForEvent</code> API over the coming weeks.</p>Wed, 15 Jan 2025 00:00:00 GMTWorkflowsWorkflowsWAF - WAF Release - 2025-01-13https://developers.cloudflare.com/changelog/post/2025-01-13-waf-release/https://developers.cloudflare.com/changelog/post/2025-01-13-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="6e0bfbe4b9c6454c8bd7bd24f49e5840"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f49e5840</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100704</td><td><p>Cleo Harmony - Auth Bypass - CVE:CVE-2024-55956, CVE:CVE-2024-55953</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="c993997b7d904a9e89448fe6a6d43bc2"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a6d43bc2</span></button></rule-id></td><td>100705</td><td>Sentry - SSRF</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="f40ce742be534ba19d610961ce6311bb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ce6311bb</span></button></rule-id></td><td>100706</td><td>Apache Struts - Remote Code Execution - CVE:CVE-2024-53677</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="67ac639a845c482d948b465b2233da1f"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...2233da1f</span></button></rule-id></td><td>100707</td><td><p>FortiWLM - Remote Code Execution - CVE:CVE-2023-48782, CVE:CVE-2023-34993, CVE:CVE-2023-34990</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Managed Ruleset</td><td><rule-id id="870cca2b874d41738019d4c3e31d972a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e31d972a</span></button></rule-id></td><td>100007C_BETA</td><td>Command Injection - Common Attack Commands</td><td></td><td>Disabled</td><td></td></tr></tbody></table>Mon, 13 Jan 2025 00:00:00 GMTWAFWAFRules - New Rules Overview Interfacehttps://developers.cloudflare.com/changelog/post/2025-01-09-rules-overview/https://developers.cloudflare.com/changelog/post/2025-01-09-rules-overview/<p><strong>Rules Overview</strong> gives you a single page to manage all your <a href="https://developers.cloudflare.com/rules/">Cloudflare Rules</a>.</p> <p>What you can do:</p> <ul> <li><strong>See all your rules in one place</strong> – No more clicking around.</li> <li><strong>Find rules faster</strong> – Search by name.</li> <li><strong>Understand execution order</strong> – See how rules run in sequence.</li> <li><strong>Debug easily</strong> – Use <a href="https://developers.cloudflare.com/rules/trace-request/">Trace</a> without switching tabs.</li> </ul> <p>Check it out in <a href="https://dash.cloudflare.com/?to=/:account/:zone/rules/overview" target="_blank" rel="noopener">Rules &gt; Overview<span class="external-link"> ↗</span></a>.</p>Thu, 09 Jan 2025 00:00:00 GMTRulesRulesCache - Smart Tiered Cache optimizes Load Balancing Poolshttps://developers.cloudflare.com/changelog/post/2025-01-08-smart-tiered-cache-for-load-balancing/https://developers.cloudflare.com/changelog/post/2025-01-08-smart-tiered-cache-for-load-balancing/<p>You can now achieve higher cache hit rates and reduce origin load when using <a href="https://developers.cloudflare.com/load-balancing/">Load Balancing</a> with <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a>. Cloudflare automatically selects a single, optimal tiered data center for all origins in your Load Balancing Pool.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you use <a href="https://developers.cloudflare.com/load-balancing/">Load Balancing</a> with <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a>, Cloudflare analyzes performance metrics across your pool's origins and automatically selects the optimal Upper Tier data center for the entire pool. This means:</p> <ul> <li><strong>Consistent cache location</strong>: All origins in the pool share the same Upper Tier cache.</li> <li><strong>Higher HIT rates</strong>: Requests for the same content hit the cache more frequently.</li> <li><strong>Reduced origin requests</strong>: Fewer requests reach your origin servers.</li> <li><strong>Improved performance</strong>: Faster response times for cache HITs.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-workflow">Example workflow</h4><a class="anchor-link" href="#example-workflow"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="txt"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="txt" data-nb-lang="txt"><code><span class="line"><span class="nb-shiki-wvjl67">Load Balancing Pool: api-pool</span></span> <span class="line"><span class="nb-shiki-wvjl67">├── Origin 1: api-1.example.com</span></span> <span class="line"><span class="nb-shiki-wvjl67">├── Origin 2: api-2.example.com</span></span> <span class="line"><span class="nb-shiki-wvjl67">└── Origin 3: api-3.example.com</span></span> <span class="line"><span class="nb-shiki-wvjl67"> ↓</span></span> <span class="line"><span class="nb-shiki-wvjl67">Selected Upper Tier: [Optimal data center based on pool performance]</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, enable <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a> on your zone and configure your <a href="https://developers.cloudflare.com/load-balancing/">Load Balancing Pool</a>.</p>Wed, 08 Jan 2025 00:00:00 GMTCacheCacheD1 - 40-60% Faster D1 Worker API Requestshttps://developers.cloudflare.com/changelog/post/2025-01-07-d1-faster-query/https://developers.cloudflare.com/changelog/post/2025-01-07-d1-faster-query/<p>Users making <a href="https://developers.cloudflare.com/d1/">D1</a> requests via the <a href="https://developers.cloudflare.com/d1/worker-api/">Workers API</a> can see up to a 60% end-to-end latency improvement due to the removal of redundant network round trips needed for each request to a D1 database.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=4437,height=1754,format=webp/_astro/faster-d1-worker-api.4S7VSUdP.png" alt="D1 Worker API latency" loading="lazy" decoding="async" width="4437" height="1754"> <p><em>p50, p90, and p95 request latency aggregated across entire D1 service. These latencies are a reference point and should not be viewed as your exact workload improvement.</em></p> <p>This performance improvement benefits all D1 Worker API traffic, especially cross-region requests where network latency is an outsized latency factor. For example, a user in Europe talking to a database in North America. D1 <a href="https://developers.cloudflare.com/d1/configuration/data-location/#provide-a-location-hint">location hints</a> can be used to influence the geographic location of a database.</p> <p>For more details on how D1 removed redundant round trips, see the D1 specific release note <a href="https://developers.cloudflare.com/d1/platform/release-notes/#2025-01-07">entry</a>.</p>Tue, 07 Jan 2025 00:00:00 GMTD1D1WAF - WAF Release - 2025-01-06https://developers.cloudflare.com/changelog/post/2025-01-06-waf-release/https://developers.cloudflare.com/changelog/post/2025-01-06-waf-release/<table style="width: 100%"><thead><tr><th>Ruleset</th><th>Rule ID</th><th>Legacy Rule ID</th><th>Description</th><th>Previous Action</th><th>New Action</th><th>Comments</th></tr></thead><tbody><tr><td>Cloudflare Specials</td><td><rule-id id="3a321b10270b42549ac201009da08beb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...9da08beb</span></button></rule-id><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&type=script&index=0&lang.ts"></script></td><td>100678</td><td>Pandora FMS - Remote Code Execution - CVE:CVE-2024-11320</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="1fe510368b4a47dda90363c2ecdf3d02"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...ecdf3d02</span></button></rule-id></td><td>100679</td><td><p>Palo Alto Networks - Remote Code Execution - CVE:CVE-2024-0012, CVE:CVE-2024-9474</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="b7ba636927b44ee288b9a697a40f2a35"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a40f2a35</span></button></rule-id></td><td>100680</td><td>Ivanti - Command Injection - CVE:CVE-2024-37397</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="6bd9b07c8acc4beeb17c8bee58ae3c89"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...58ae3c89</span></button></rule-id></td><td>100681</td><td>Really Simple Security - Auth Bypass - CVE:CVE-2024-10924</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="c86e79e15a4a4307870f6f77e37f2da6"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e37f2da6</span></button></rule-id></td><td>100682</td><td>Magento - XXE - CVE:CVE-2024-34102</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="945f41b48be9485f953116015054c752"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...5054c752</span></button></rule-id></td><td>100683</td><td>CyberPanel - Remote Code Execution - CVE:CVE-2024-51567</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="aec9a2e554a34a8fa547d069dfe93d7b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...dfe93d7b</span></button></rule-id></td><td>100684</td><td><p>Microsoft SharePoint - Remote Code Execution - CVE:CVE-2024-38094, CVE:CVE-2024-38024, CVE:CVE-2024-38023</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="e614dd46c1ce404da1909e841454c856"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...1454c856</span></button></rule-id></td><td>100685</td><td>CyberPanel - Remote Code Execution - CVE:CVE-2024-51568</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="685a4edf68f740b4a2c80d45e92362e5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...e92362e5</span></button></rule-id></td><td>100686</td><td>Seeyon - Remote Code Execution</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="204f9d948a124829acb86555b9f1c9f8"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b9f1c9f8</span></button></rule-id></td><td>100687</td><td><p>WordPress - Remote Code Execution - CVE:CVE-2024-10781, CVE:CVE-2024-10542</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="19587024724e49329d5b482d0d7ca374"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...0d7ca374</span></button></rule-id></td><td>100688</td><td>ProjectSend - Remote Code Execution - CVE:CVE-2024-11680</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="fa49213e55484f6c824e0682a5260b70"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...a5260b70</span></button></rule-id></td><td>100689</td><td><p>Palo Alto GlobalProtect - Remote Code Execution - CVE:CVE-2024-5921</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="11b5fc23e85b41ca90316bddd007118b"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...d007118b</span></button></rule-id></td><td>100690</td><td>Ivanti - Remote Code Execution - CVE:CVE-2024-37404</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="aaeada52bcc840598515de6cc3e49f64"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...c3e49f64</span></button></rule-id></td><td>100691</td><td>Array Networks - Remote Code Execution - CVE:CVE-2023-28461</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="e2c7ce1ecd6847219f8d9aedfcc6f5bb"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...fcc6f5bb</span></button></rule-id></td><td>100692</td><td>CyberPanel - Remote Code Execution - CVE:CVE-2024-51378</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="84d481b1f49c4735afa2fb2bb615335e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b615335e</span></button></rule-id></td><td>100693</td><td>Symfony Profiler - Auth Bypass - CVE:CVE-2024-50340</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="9f258f463f9f4b26ad07e3c209d08c8a"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...09d08c8a</span></button></rule-id></td><td>100694</td><td>Citrix Virtual Apps - Remote Code Execution - CVE:CVE-2024-8069</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="b490d6edcfec4028aef45cf08aafb2f5"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...8aafb2f5</span></button></rule-id></td><td>100695</td><td>MSMQ Service - Remote Code Execution - CVE:CVE-2023-21554</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="c8f65bc9eeef4665820ecfe411b7a8c7"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...11b7a8c7</span></button></rule-id></td><td>100696</td><td>Nginxui - Remote Code Execution - CVE:CVE-2024-49368</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="d5f2e133e34640198d06d7b345954c7e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...45954c7e</span></button></rule-id></td><td>100697</td><td><p>Apache ShardingSphere - Remote Code Execution - CVE:CVE-2022-22733</p></td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="c34432e257074cffa9fa15f3f5311209"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...f5311209</span></button></rule-id></td><td>100698</td><td>Mitel MiCollab - Auth Bypass - CVE:CVE-2024-41713</td><td>Log</td><td>Block</td><td>New Detection</td></tr><tr><td>Cloudflare Specials</td><td><rule-id id="3bda15acd73a4b55a5f60cd2b3e5e46e"><button title="Copy rule ID" aria-label="Copy rule ID" class="border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150"><span class="font-mono text-[0.8125rem] font-medium">...b3e5e46e</span></button></rule-id></td><td>100699</td><td>Apache Solr - Auth Bypass - CVE:CVE-2024-45216</td><td>Log</td><td>Block</td><td>New Detection</td></tr></tbody></table>Mon, 06 Jan 2025 00:00:00 GMTWAFWAFAI Gateway - AI Gateway adds DeepSeek as a Providerhttps://developers.cloudflare.com/changelog/post/2025-01-07-aig-provider-deepseek/https://developers.cloudflare.com/changelog/post/2025-01-07-aig-provider-deepseek/<p><a href="https://developers.cloudflare.com/ai-gateway/"><strong>AI Gateway</strong></a> now supports <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/deepseek/"><strong>DeepSeek</strong></a>, including their cutting-edge DeepSeek-V3 model. With this addition, you have even more flexibility to manage and optimize your AI workloads using AI Gateway. Whether you're leveraging DeepSeek or other providers, like OpenAI, Anthropic, or <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>, AI Gateway empowers you to:</p> <ul> <li><strong>Monitor</strong>: Gain actionable insights with analytics and logs.</li> <li><strong>Control</strong>: Implement caching, rate limiting, and fallbacks.</li> <li><strong>Optimize</strong>: Improve performance with feedback and evaluations.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=131,format=webp/_astro/deepseek.hirkr3rv.png" alt="AI Gateway adds DeepSeek as a provider" loading="lazy" decoding="async" width="1600" height="131"> <p>To get started, simply update the base URL of your DeepSeek API calls to route through AI Gateway. Here's how you can send a request using cURL:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="bash"><figcaption class="nb-code-title"><span class="nb-code-title-name">Example fetch request</span><span class="nb-code-title-lang">bash</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-mdbnqw"> https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/deepseek/chat/completions</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'content-type: application/json'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --header</span><span class="nb-shiki-mdbnqw"> 'Authorization: Bearer DEEPSEEK_TOKEN'</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-dzsirb"> --data</span><span class="nb-shiki-mdbnqw"> '{</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "model": "deepseek-chat",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "messages": [</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "role": "user",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "content": "What is Cloudflare?"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> ]</span></span> <span class="line"><span class="nb-shiki-mdbnqw">}'</span></span></code></pre></figure> <p>For detailed setup instructions, see our <a href="https://developers.cloudflare.com/ai-gateway/usage/providers/deepseek/">DeepSeek provider documentation</a>.</p>Thu, 02 Jan 2025 00:00:00 GMTAI GatewayAI GatewayWorkers - Faster Workers Builds with Build Caching and Watch Pathshttps://developers.cloudflare.com/changelog/post/2024-12-29-faster-builds/https://developers.cloudflare.com/changelog/post/2024-12-29-faster-builds/<img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1494,height=140,format=webp/_astro/workers-build-caching.DWEh3Tj1.png" alt="Build caching settings" loading="lazy" decoding="async" width="1494" height="140"><img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1494,height=190,format=webp/_astro/workers-build-watch-paths.ClqD-iNq.png" alt="Build watch path settings" loading="lazy" decoding="async" width="1494" height="190"> <p><a href="https://developers.cloudflare.com/workers/ci-cd/builds/"><strong>Workers Builds</strong></a>, the integrated CI/CD system for Workers (currently in beta), now lets you cache artifacts across builds, speeding up build jobs by eliminating repeated work, such as downloading dependencies at the start of each build.</p> <ul> <li> <p><strong><a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-caching/">Build Caching</a></strong>: Cache dependencies and build outputs between builds with a shared project-wide cache, ensuring faster builds for the entire team.</p> </li> <li> <p><strong><a href="https://developers.cloudflare.com/workers/ci-cd/builds/build-watch-paths/">Build Watch Paths</a></strong>: Define paths to include or exclude from the build process, ideal for <a href="https://developers.cloudflare.com/workers/ci-cd/builds/advanced-setups/#monorepos">monorepos</a> to target only the files that need to be rebuilt per Workers project.</p> </li> </ul> <p>To get started, select your Worker on the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> then go to <strong>Settings</strong> &gt; <strong>Builds</strong>, and connect a GitHub or GitLab repository. Once connected, you'll see options to configure Build Caching and Build Watch Paths.</p>Sun, 29 Dec 2024 00:00:00 GMTWorkersWorkersEmail security - Escalate user submissionshttps://developers.cloudflare.com/changelog/post/2024-12-19-escalate-user-submissions/https://developers.cloudflare.com/changelog/post/2024-12-19-escalate-user-submissions/<p>After you triage your users' submissions (that are machine reviewed), you can now escalate them to our team for reclassification (which are instead human reviewed). User submissions from the submission alias, PhishNet, and our API can all be escalated.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=897,height=434,format=webp/_astro/Escalate.CwXPIyM3.png" alt="Escalate" loading="lazy" decoding="async" width="897" height="434"> <p>From <strong>Reclassifications</strong>, go to <strong>User submissions</strong>. Select the three dots next to any of the user submissions, then select <strong>Escalate</strong> to create a team request for reclassification. The Cloudflare dashboard will then show you the submissions on the <strong>Team Submissions</strong> tab.</p> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-one/email-security/submissions/user-submissions/">User submissions</a> to learn more about this feature.</p> <p>This feature is available across these Email security packages:</p> <ul> <li><strong>Advantage</strong></li> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 19 Dec 2024 23:22:49 GMTEmail securityEmail securityEmail security - Increased transparency for phishing email submissionshttps://developers.cloudflare.com/changelog/post/2024-12-19-reclassification-tab/https://developers.cloudflare.com/changelog/post/2024-12-19-reclassification-tab/ <p>You now have more transparency about team and user submissions for phishing emails through a <strong>Reclassification</strong> tab in the Zero Trust dashboard.</p> <p>Reclassifications happen when users or admins <a href="https://developers.cloudflare.com/cloudflare-one/email-security/settings/phish-submissions/">submit a phish</a> to Email security. Cloudflare reviews and - in some cases - reclassifies these emails based on improvements to our machine learning models.</p> <p>This new tab increases your visibility into this process, allowing you to view what submissions you have made and what the outcomes of those submissions are.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1645,height=758,format=webp/_astro/reclassifications-tab.yDgtjG51.png" alt="Use the Reclassification area to review submitted phishing emails" loading="lazy" decoding="async" width="1645" height="758">Thu, 19 Dec 2024 00:00:00 GMTEmail securityEmail securityCloudflare Tunnel, Cloudflare Tunnel for SASE - Troubleshoot tunnels with diagnostic logshttps://developers.cloudflare.com/changelog/post/2024-12-19-diagnostic-logs/https://developers.cloudflare.com/changelog/post/2024-12-19-diagnostic-logs/ <p>The latest <code>cloudflared</code> build <a href="https://github.com/cloudflare/cloudflared/releases/tag/2024.12.2" target="_blank" rel="noopener">2024.12.2<span class="external-link"> ↗</span></a> introduces the ability to collect all the diagnostic logs needed to troubleshoot a <code>cloudflared</code> instance.</p> <p>A diagnostic report collects data from a single instance of <code>cloudflared</code> running on the local machine and outputs it to a <code>cloudflared-diag</code> file.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/diag-logs/">Diagnostic logs</a>.</p>Thu, 19 Dec 2024 00:00:00 GMTCloudflare TunnelCloudflare TunnelCloudflare Tunnel for SASEMagic Transit, Cloudflare WAN, Network Interconnect - Establish BGP peering over Direct CNI circuitshttps://developers.cloudflare.com/changelog/post/2024-12-17-bgp-support-cni/https://developers.cloudflare.com/changelog/post/2024-12-17-bgp-support-cni/<p>Magic WAN and Magic Transit customers can use the Cloudflare dashboard to configure and manage BGP peering between their networks and their Magic routing table when using a Direct CNI on-ramp.</p> <p>Using BGP peering allows customers to:</p> <ul> <li>Automate the process of adding or removing networks and subnets.</li> <li>Take advantage of failure detection and session recovery features.</li> </ul> <p>With this functionality, customers can:</p> <ul> <li>Establish an eBGP session between their devices and the Magic WAN / Magic Transit service when connected via CNI.</li> <li>Secure the session by MD5 authentication to prevent misconfigurations.</li> <li>Exchange routes dynamically between their devices and their Magic routing table.</li> </ul> <p>Refer to <a href="https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-routes/#configure-bgp-routes">Magic WAN BGP peering</a> or <a href="https://developers.cloudflare.com/magic-transit/how-to/configure-routes/#configure-bgp-routes">Magic Transit BGP peering</a> to learn more about this feature and how to set it up.</p>Tue, 17 Dec 2024 00:00:00 GMTMagic TransitMagic TransitCloudflare WANNetwork InterconnectHyperdrive - Up to 10x faster cached queries for Hyperdrivehttps://developers.cloudflare.com/changelog/post/2024-12-11-hyperdrive-caching-at-edge/https://developers.cloudflare.com/changelog/post/2024-12-11-hyperdrive-caching-at-edge/<p>Hyperdrive now caches queries in all Cloudflare locations, decreasing cache hit latency by up to 90%.</p> <p>When you make a query to your database and Hyperdrive has cached the query results, Hyperdrive will now return the results from the nearest cache. By caching data closer to your users, the latency for cache hits reduces by up to 90%.</p> <p>This reduction in cache hit latency is reflected in a reduction of the session duration for all queries (cached and uncached) from Cloudflare Workers to Hyperdrive, as illustrated below.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1746,height=734,format=webp/_astro/hyperdrive-edge-caching-metrics.BR7svphB.png" alt="Hyperdrive edge caching improves average session duration for database queries" loading="lazy" decoding="async" width="1746" height="734"> <p><em>P50, P75, and P90 Hyperdrive session latency for all client connection sessions (both cached and uncached queries) for Hyperdrive configurations with caching enabled during the rollout period.</em></p> <p>This performance improvement is applied to all new and existing Hyperdrive configurations that have caching enabled.</p> <p>For more details on how Hyperdrive performs query caching, refer to the <a href="https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/#3-query-caching">Hyperdrive documentation</a>.</p>Wed, 11 Dec 2024 00:00:00 GMTHyperdriveHyperdriveRules - Terraform Support for Snippetshttps://developers.cloudflare.com/changelog/post/2024-12-11-terraform-snippets/https://developers.cloudflare.com/changelog/post/2024-12-11-terraform-snippets/<p>Now, you can manage <a href="https://developers.cloudflare.com/rules/snippets/">Cloudflare Snippets</a> with <a href="https://developers.cloudflare.com/terraform/">Terraform</a>. Use infrastructure-as-code to deploy and update Snippet code and rules without manual changes in the dashboard.</p> <p>Example Terraform configuration:</p> <figure class="nb-code-figure" data-nb-lang="tf"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="tf" data-nb-lang="tf"><code><span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_snippet"</span><span class="nb-shiki-dzsirb"> "my_snippet"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> zone_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "&lt;ZONE_ID&gt;"</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_test_snippet_1"</span></span> <span class="line"><span class="nb-shiki-140thh"> main_module</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "file1.js"</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> files</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "file1.js"</span></span> <span class="line"><span class="nb-shiki-140thh"> content</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> file</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"file1.js"</span><span class="nb-shiki-140thh">)</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj">resource</span><span class="nb-shiki-dzsirb"> "cloudflare_snippet_rules"</span><span class="nb-shiki-dzsirb"> "cookie_snippet_rule"</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> zone_id</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "&lt;ZONE_ID&gt;"</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> rules</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> enabled</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-dzsirb"> true</span></span> <span class="line"><span class="nb-shiki-140thh"> expression</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "http.cookie eq </span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">a=b</span><span class="nb-shiki-dzsirb">\"</span><span class="nb-shiki-mdbnqw">"</span></span> <span class="line"><span class="nb-shiki-140thh"> description</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "Trigger snippet on specific cookie"</span></span> <span class="line"><span class="nb-shiki-140thh"> snippet_name</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-mdbnqw"> "my_test_snippet_1"</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> depends_on</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> [cloudflare_snippet</span><span class="nb-shiki-1itgoe">.</span><span class="nb-shiki-140thh">my_snippet]</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>Learn more in the <a href="https://developers.cloudflare.com/rules/snippets/create-terraform/">Configure Snippets using Terraform</a> documentation.</p>Wed, 11 Dec 2024 00:00:00 GMTRulesRulesMulti-Cloud Networking - Generate customized terraform files for building cloud network on-rampshttps://developers.cloudflare.com/changelog/post/2024-12-05-cloud-onramp-terraform/https://developers.cloudflare.com/changelog/post/2024-12-05-cloud-onramp-terraform/ <p>You can now generate customized terraform files for building cloud network on-ramps to <a href="https://developers.cloudflare.com/cloudflare-wan/">Magic WAN</a>.</p> <p><a href="https://developers.cloudflare.com/multi-cloud-networking/">Magic Cloud</a> can scan and discover existing network resources and generate the required terraform files to automate cloud resource deployment using their existing infrastructure-as-code workflows for cloud automation.</p> <p>You might want to do this to:</p> <ul> <li>Review the proposed configuration for an on-ramp before deploying it with Cloudflare.</li> <li>Deploy the on-ramp using your own infrastructure-as-code pipeline instead of deploying it with Cloudflare.</li> </ul> <p>For more details, refer to <a href="https://developers.cloudflare.com/multi-cloud-networking/cloud-on-ramps/#set-up-with-terraform">Set up with Terraform</a>.</p>Thu, 05 Dec 2024 00:00:00 GMTMulti-Cloud NetworkingMulti-Cloud NetworkingCASB - Find security misconfigurations in your AWS cloud environmenthttps://developers.cloudflare.com/changelog/post/2024-11-22-cloud-data-extraction-aws/https://developers.cloudflare.com/changelog/post/2024-11-22-cloud-data-extraction-aws/ <p>You can now use CASB to find security misconfigurations in your AWS cloud environment using <a href="https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/">Data Loss Prevention</a>.</p> <p>You can also <a href="https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/aws-s3/#compute-account">connect your AWS compute account</a> to extract and scan your S3 buckets for sensitive data while avoiding egress fees. CASB will scan any objects that exist in the bucket at the time of configuration.</p> <p>To connect a compute account to your AWS integration:</p> <ol> <li>In <a href="https://one.dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare One<span class="external-link"> ↗</span></a>, go to <strong>Cloud &amp; SaaS findings</strong> &gt; <strong>Integrations</strong>.</li> <li>Find and select your AWS integration.</li> <li>Select <strong>Open connection instructions</strong>.</li> <li>Follow the instructions provided to connect a new compute account.</li> <li>Select <strong>Refresh</strong>.</li> </ol>Fri, 22 Nov 2024 00:00:00 GMTCASBCASBRules - Cloud Connector Now Supports R2https://developers.cloudflare.com/changelog/post/2024-11-22-cloud-connector-r2/https://developers.cloudflare.com/changelog/post/2024-11-22-cloud-connector-r2/<p>Now, you can use <a href="https://developers.cloudflare.com/rules/cloud-connector/">Cloud Connector</a> to route traffic to your <a href="https://developers.cloudflare.com/r2/">R2 buckets</a> based on URLs, headers, geolocation, and more.</p> <p>Example setup:</p> <figure class="nb-code-figure" data-nb-lang="bash"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="bash" data-nb-lang="bash"><code><span class="line"><span class="nb-shiki-1t8gfj">curl</span><span class="nb-shiki-dzsirb"> --request</span><span class="nb-shiki-mdbnqw"> PUT</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-mdbnqw">"https://api.cloudflare.com/client/v4/zones/{zone_id}/cloud_connector/rules"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Authorization: Bearer &lt;API_TOKEN&gt;"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--header </span><span class="nb-shiki-mdbnqw">"Content-Type: application/json"</span><span class="nb-shiki-dzsirb"> \</span></span> <span class="line"><span class="nb-shiki-140thh">--data </span><span class="nb-shiki-mdbnqw">'[</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "expression": "http.request.uri.path wildcard \"/images/*\"",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "provider": "cloudflare_r2",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "description": "Connect to R2 bucket containing images",</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "parameters": {</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "host": "mybucketcustomdomain.example.com"</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> }</span></span> <span class="line"><span class="nb-shiki-mdbnqw">]'</span></span></code></pre></figure> <p>Get started using <a href="https://developers.cloudflare.com/rules/cloud-connector/">Cloud Connector</a> documentation.</p>Fri, 22 Nov 2024 00:00:00 GMTRulesRulesBrowser Isolation - Improved non-English keyboard supporthttps://developers.cloudflare.com/changelog/post/2024-11-21-non-english-keyboard/https://developers.cloudflare.com/changelog/post/2024-11-21-non-english-keyboard/<p>You can now type in languages that use diacritics (like á or ç) and character-based scripts (such as Chinese, Japanese, and Korean) directly within the remote browser. The isolated browser now properly recognizes non-English keyboard input, eliminating the need to copy and paste content from a local browser or device.</p>Thu, 21 Nov 2024 00:00:00 GMTBrowser IsolationBrowser IsolationCache - Smart Tiered Cache automatically optimizes R2 cachinghttps://developers.cloudflare.com/changelog/post/2024-11-20-smart-tiered-cache-for-r2/https://developers.cloudflare.com/changelog/post/2024-11-20-smart-tiered-cache-for-r2/<p>You can now reduce latency and lower R2 egress costs automatically when using <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a> with <a href="https://developers.cloudflare.com/r2/">R2</a>. Cloudflare intelligently selects a tiered data center close to your R2 bucket location, creating an efficient caching topology without additional configuration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When you enable <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a> for zones using <a href="https://developers.cloudflare.com/r2/">R2</a> as an origin, Cloudflare automatically:</p> <ol> <li><strong>Identifies your R2 bucket location</strong>: Determines the geographical region where your R2 bucket is stored.</li> <li><strong>Selects an optimal Upper Tier</strong>: Chooses a data center close to your bucket as the common Upper Tier cache.</li> <li><strong>Routes requests efficiently</strong>: All cache misses in edge locations route through this Upper Tier before reaching R2.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Automatic optimization</strong>: No manual configuration required.</li> <li><strong>Lower egress costs</strong>: Fewer requests to R2 reduce egress charges.</li> <li><strong>Improved hit ratio</strong>: Common Upper Tier increases cache efficiency.</li> <li><strong>Reduced latency</strong>: Upper Tier proximity to R2 minimizes fetch times.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, enable <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/">Smart Tiered Cache</a> on your zone using R2 as an origin.</p>Wed, 20 Nov 2024 00:00:00 GMTCacheCacheWorkers - Bypass caching for subrequests made from Cloudflare Workers, with Request.cachehttps://developers.cloudflare.com/changelog/post/2024-11-11-cache-no-store/https://developers.cloudflare.com/changelog/post/2024-11-11-cache-no-store/ <p>You can now use the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#options"><code>cache</code></a> property of the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/"><code>Request</code></a> interface to bypass <a href="https://developers.cloudflare.com/workers/reference/how-the-cache-works/">Cloudflare's cache</a> when making subrequests from <a href="https://developers.cloudflare.com/workers">Cloudflare Workers</a>, by setting its value to <code>no-store</code>.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> request</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://cloudflare.com"</span><span class="nb-shiki-140thh">, {</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: </span><span class="nb-shiki-mdbnqw">"no-store"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">req</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> request</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"https://cloudflare.com"</span><span class="nb-shiki-140thh">, { cache: </span><span class="nb-shiki-mdbnqw">'no-store'</span><span class="nb-shiki-140thh">});</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">} </span><span class="nb-shiki-1itgoe">satisfies</span><span class="nb-shiki-1t8gfj"> ExportedHandler</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Environment</span><span class="nb-shiki-140thh">></span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>When you set the value to <code>no-store</code> on a subrequest made from a Worker, the Cloudflare Workers runtime will not check whether a match exists in the cache, and not add the response to the cache, even if the response includes directives in the <code>Cache-Control</code> HTTP header that otherwise indicate that the response is cacheable.</p> <p>This increases compatibility with NPM packages and JavaScript frameworks that rely on setting the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/#options"><code>cache</code></a> property, which is a cross-platform standard part of the <a href="https://developers.cloudflare.com/workers/runtime-apis/request/"><code>Request</code></a> interface. Previously, if you set the <code>cache</code> property on <code>Request</code>, the Workers runtime threw an exception.</p> <p>If you've tried to use <code>@planetscale/database</code>, <code>redis-js</code>, <code>stytch-node</code>, <code>supabase</code>, <code>axiom-js</code> or have seen the error message <code>The cache field on RequestInitializerDict is not implemented in fetch</code> — you should try again, making sure that the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-dates/">Compatibility Date</a> of your Worker is set to on or after <code>2024-11-11</code>, or the <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#enable-cache-no-store-http-standard-api"><code>cache_option_enabled</code> compatibility flag</a> is enabled for your Worker.</p> <ul> <li>Learn <a href="https://developers.cloudflare.com/workers/reference/how-the-cache-works/">how the Cache works with Cloudflare Workers</a></li> <li>Enable <a href="https://developers.cloudflare.com/workers/runtime-apis/nodejs/">Node.js compatibility</a> for your Cloudflare Worker</li> <li>Explore <a href="https://developers.cloudflare.com/workers/runtime-apis/">Runtime APIs</a> and <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/">Bindings</a> available in Cloudflare Workers</li> </ul>Mon, 11 Nov 2024 00:00:00 GMTWorkersWorkersEmail security - Use Logpush for Email security user actionshttps://developers.cloudflare.com/changelog/post/2024-11-07-logpush-user-actions/https://developers.cloudflare.com/changelog/post/2024-11-07-logpush-user-actions/<p>You can now send user action logs for Email security to an endpoint of your choice with Cloudflare Logpush.</p> <p>Filter logs matching specific criteria you have set or select from multiple fields you want to send. For all users, we will log the date and time, user ID, IP address, details about the message they accessed, and what actions they took.</p> <p>When creating a new Logpush job, remember to select <strong>Audit logs</strong> as the dataset and filter by:</p> <ul> <li><strong>Field</strong>: <code>"ResourceType"</code></li> <li><strong>Operator</strong>: <code>"starts with"</code></li> <li><strong>Value</strong>: <code>"email_security"</code>.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=829,height=454,format=webp/_astro/Logpush-User-Actions.D14fWgmq.png" alt="Logpush-user-actions" loading="lazy" decoding="async" width="829" height="454"> <p>For more information, refer to <a href="https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/email-security-logs/#enable-user-action-logs">Enable user action logs</a>.</p> <p>This feature is available across all Email security packages:</p> <ul> <li><strong>Enterprise</strong></li> <li><strong>Enterprise + PhishGuard</strong></li> </ul>Thu, 07 Nov 2024 23:22:49 GMTEmail securityEmail securityCache - Stage and test cache configurations safelyhttps://developers.cloudflare.com/changelog/post/2024-11-07-cache-versioning/https://developers.cloudflare.com/changelog/post/2024-11-07-cache-versioning/<p>You can now stage and test cache configurations before deploying them to production. Versioned environments let you safely validate cache rules, purge operations, and configuration changes without affecting live traffic.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>With versioned environments, you can:</p> <ol> <li><strong>Create staging versions</strong> of your cache configuration.</li> <li><strong>Test cache rules</strong> in a non-production environment.</li> <li><strong>Purge staged content</strong> independently from production.</li> <li><strong>Validate changes</strong> before promoting to production.</li> </ol> <p>This capability integrates with Cloudflare's broader <a href="https://developers.cloudflare.com/version-management/">versioning system</a>, allowing you to manage cache configurations alongside other zone settings.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="benefits">Benefits</h4><a class="anchor-link" href="#benefits"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Risk-free testing</strong>: Validate configuration changes without impacting production.</li> <li><strong>Independent purging</strong>: Clear staging cache without affecting live content.</li> <li><strong>Deployment confidence</strong>: Catch issues before they reach end users.</li> <li><strong>Team collaboration</strong>: Multiple team members can work on different versions.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, refer to the <a href="https://developers.cloudflare.com/version-management/">version management documentation</a>.</p> <aside role="note" aria-label="Important limitation" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Important limitation</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>Cache Reserve is only supported for your production environment. Staged environments can use standard cache functionality, but Cache Reserve persistence is limited to production deployments.</p></div></div></aside>Thu, 07 Nov 2024 00:00:00 GMTCacheCacheCache - Shard cache using custom cache key valueshttps://developers.cloudflare.com/changelog/post/2024-11-07-shard-cache-by-cache-key/https://developers.cloudflare.com/changelog/post/2024-11-07-shard-cache-by-cache-key/<p>Enterprise customers can now optimize cache hit ratios for content that varies by device, language, or referrer by <strong>sharding cache</strong> using up to ten values from previously restricted headers with <a href="https://developers.cloudflare.com/cache/how-to/cache-keys/">custom cache keys</a>.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>When configuring <a href="https://developers.cloudflare.com/cache/how-to/cache-keys/">custom cache keys</a>, you can now include values from these headers to create distinct cache entries:</p> <ul> <li><strong><code>accept*</code> headers</strong> (for example, <code>accept</code>, <code>accept-encoding</code>, <code>accept-language</code>): Serve different cached versions based on content negotiation.</li> <li><strong><code>referer</code> header</strong>: Cache content differently based on the referring page or site.</li> <li><strong><code>user-agent</code> header</strong>: Maintain separate caches for different browsers, devices, or bots.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="when-to-use-cache-sharding">When to use cache sharding</h4><a class="anchor-link" href="#when-to-use-cache-sharding"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li>Content varies significantly by device type (mobile vs desktop).</li> <li>Different language or encoding preferences require distinct responses.</li> <li>Referrer-specific content optimization is needed.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example-configuration">Example configuration</h4><a class="anchor-link" href="#example-configuration"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <figure class="nb-code-figure" data-nb-lang="json"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="json" data-nb-lang="json"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "cache_key"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "custom_key"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "header"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "include"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"accept-language"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"user-agent"</span><span class="nb-shiki-140thh">],</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "check_presence"</span><span class="nb-shiki-140thh">: [</span><span class="nb-shiki-mdbnqw">"referer"</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure> <p>This configuration creates separate cache entries based on the <code>accept-language</code> and <code>user-agent</code> headers, while also considering whether the <code>referer</code> header is present.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, refer to the <a href="https://developers.cloudflare.com/cache/how-to/cache-keys/">custom cache keys documentation</a>.</p> <aside role="note" aria-label="Note" class="aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4" style="--_c: var(--nb-info); --_t: var(--nb-info-muted);" data-astro-cid-znle5jil><span class="flex h-[1.375em] shrink-0 items-center" aria-hidden="true" data-astro-cid-znle5jil><svg width="1em" height="1em" viewBox="0 0 256 256" class="h-[1em] w-[1em]" data-astro-cid-znle5jil="true" data-icon="ph:info"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m16-40a8 8 0 0 1-8 8a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 8 8m-32-92a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg></span><div class="flex min-w-0 flex-1 flex-col gap-0.5" data-astro-cid-znle5jil><p class="m-0 text-base leading-snug font-semibold" data-astro-cid-znle5jil>Note</p><div class="aside-card-body text-sm leading-normal" data-astro-cid-znle5jil><p>While cache sharding can improve hit ratios for specific use cases, overly sharding your cache can reduce overall cache efficiency and negatively impact performance. Carefully evaluate whether sharding benefits your specific traffic patterns.</p></div></div></aside>Thu, 07 Nov 2024 00:00:00 GMTCacheCacheWorkers, Workflows - Workflows is now in open betahttps://developers.cloudflare.com/changelog/post/2024-10-24-workflows-beta/https://developers.cloudflare.com/changelog/post/2024-10-24-workflows-beta/ <p>Workflows is now in open beta, and available to any developer a free or paid Workers plan.</p> <p>Workflows allow you to build multi-step applications that can automatically retry, persist state and run for minutes, hours, days, or weeks. Workflows introduces a programming model that makes it easier to build reliable, long-running tasks, observe as they progress, and programmatically trigger instances based on events across your services.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>You can get started with Workflows by <a href="https://developers.cloudflare.com/workflows/get-started/guide/">following our get started guide</a> and/or using <code>npm create cloudflare</code> to pull down the starter project:</p> <figure class="nb-code-figure" data-nb-lang="sh"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="sh" data-nb-lang="sh"><code><span class="line"><span class="nb-shiki-1t8gfj">npm</span><span class="nb-shiki-mdbnqw"> create</span><span class="nb-shiki-mdbnqw"> cloudflare@latest</span><span class="nb-shiki-mdbnqw"> workflows-starter</span><span class="nb-shiki-dzsirb"> --</span><span class="nb-shiki-dzsirb"> --template</span><span class="nb-shiki-mdbnqw"> "cloudflare/workflows-starter"</span></span></code></pre></figure> <p>You can open the <code>src/index.ts</code> file, extend it, and use <code>wrangler deploy</code> to deploy your first Workflow. From there, you can:</p> <ul> <li>Learn the <a href="https://developers.cloudflare.com/workflows/build/workers-api/">Workflows API</a></li> <li><a href="https://developers.cloudflare.com/workflows/build/trigger-workflows/">Trigger Workflows</a> via your Workers apps.</li> <li>Understand the <a href="https://developers.cloudflare.com/workflows/build/rules-of-workflows/">Rules of Workflows</a> and how to adopt best practices</li> </ul>Thu, 24 Oct 2024 00:00:00 GMTWorkersWorkersWorkflowsRules - Simplified UI for URL Rewriteshttps://developers.cloudflare.com/changelog/post/2024-10-23-url-rewrites-wildcard/https://developers.cloudflare.com/changelog/post/2024-10-23-url-rewrites-wildcard/<p>It’s now easy to create <strong>wildcard-based <a href="https://developers.cloudflare.com/rules/transform/url-rewrite/">URL Rewrites</a></strong>. No need for complex functions—just define your patterns and go.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1158,height=1305,format=webp/_astro/create-url-rewrite-rule.DIgpB8IB.png" alt="Rules Overview Interface" loading="lazy" decoding="async" width="1158" height="1305"> <p>What’s improved:</p> <ul> <li><strong>Full wildcard support</strong> – Create rewrite patterns using intuitive interface.</li> <li><strong>Simplified rule creation</strong> – No need for complex functions.</li> </ul> <p>Try it via <a href="https://developers.cloudflare.com/rules/transform/url-rewrite/create-dashboard/#wildcard-pattern-parameters">creating a Rewrite URL rule in the dashboard</a>.</p>Wed, 23 Oct 2024 00:00:00 GMTRulesRulesLogs - New fields added to Gateway-related datasets in Cloudflare Logshttps://developers.cloudflare.com/changelog/post/2024-10-08-new-gateway-fields/https://developers.cloudflare.com/changelog/post/2024-10-08-new-gateway-fields/<p>Cloudflare has introduced new fields to two Gateway-related datasets in Cloudflare Logs:</p> <ul> <li> <p><strong>Gateway HTTP</strong>: <code>ApplicationIDs</code>, <code>ApplicationNames</code>, <code>CategoryIDs</code>, <code>CategoryNames</code>, <code>DestinationIPContinentCode</code>, <code>DestinationIPCountryCode</code>, <code>ProxyEndpoint</code>, <code>SourceIPContinentCode</code>, <code>SourceIPCountryCode</code>, <code>VirtualNetworkID</code>, and <code>VirtualNetworkName</code>.</p> </li> <li> <p><strong>Gateway Network</strong>: <code>ApplicationIDs</code>, <code>ApplicationNames</code>, <code>DestinationIPContinentCode</code>, <code>DestinationIPCountryCode</code>, <code>ProxyEndpoint</code>, <code>SourceIPContinentCode</code>, <code>SourceIPCountryCode</code>, <code>TransportProtocol</code>, <code>VirtualNetworkID</code>, and <code>VirtualNetworkName</code>.</p> </li> </ul>Tue, 08 Oct 2024 00:00:00 GMTLogsLogsCloudflare Network Firewall - Search for custom rules using rule name and/or IDhttps://developers.cloudflare.com/changelog/post/2024-10-02-custom-rule-search/https://developers.cloudflare.com/changelog/post/2024-10-02-custom-rule-search/<p>The Magic Firewall dashboard now allows you to search custom rules using the rule name and/or ID.</p> <ol> <li>Log into the <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a> and select your account.</li> <li>Go to <strong>Analytics &amp; Logs</strong> &gt; <strong>Network Analytics</strong>.</li> <li>Select <strong>Magic Firewall</strong>.</li> <li>Add a filter for <strong>Rule ID</strong>.</li> </ol> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1032,height=801,format=webp/_astro/search-with-rule-id.DJgzqgKk.png" alt="Search for firewall rules with rule IDs" loading="lazy" decoding="async" width="1032" height="801"> <p>Additionally, the rule ID URL link has been added to Network Analytics.</p>Wed, 02 Oct 2024 00:00:00 GMTCloudflare Network FirewallCloudflare Network FirewallAccess - Eliminate long-lived credentials and enhance SSH security with Cloudflare Access for Infrastructurehttps://developers.cloudflare.com/changelog/post/2024-10-01-ssh-with-access-for-infrastructure/https://developers.cloudflare.com/changelog/post/2024-10-01-ssh-with-access-for-infrastructure/<p>Organizations can now eliminate long-lived credentials from their SSH setup and enable strong multi-factor authentication for SSH access, similar to other Access applications, all while generating access and command logs.</p> <p>SSH with <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/">Access for Infrastructure</a> uses short-lived SSH certificates from Cloudflare, eliminating SSH key management and reducing the security risks associated with lost or stolen keys. It also leverages a common deployment model for Cloudflare One customers: <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-device-client/">WARP-to-Tunnel</a>.</p> <p>SSH with Access for Infrastructure enables you to:</p> <ul> <li><strong>Author fine-grained policy</strong> to control who may access your SSH servers, including specific ports, protocols, and SSH users.</li> <li><strong>Monitor infrastructure access</strong> with Access and SSH command logs, supporting regulatory compliance and providing visibility in case of security breach.</li> <li><strong>Preserve your end users' workflows.</strong> SSH with Access for Infrastructure supports native SSH clients and does not require any modifications to users’ SSH configs.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1916,height=1714,format=webp/_astro/infrastructure-app.BhpJOgxs.png" alt="Example of an infrastructure Access application" loading="lazy" decoding="async" width="1916" height="1714"> <p>To get started, refer to <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/">SSH with Access for Infrastructure</a>.</p>Tue, 01 Oct 2024 00:00:00 GMTAccessAccessNetwork Flow - Try out Magic Network Monitoringhttps://developers.cloudflare.com/changelog/post/2024-09-24-magic-network-monitoring/https://developers.cloudflare.com/changelog/post/2024-09-24-magic-network-monitoring/<p>The free version of Magic Network Monitoring (MNM) is now available to everyone with a Cloudflare account by default.</p> <ol> <li>Log in to your <a href="https://dash.cloudflare.com" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, and select your account.</li> <li>Go to <strong>Analytics &amp; Logs</strong> &gt; <strong>Magic Monitoring</strong>.</li> </ol> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=852,height=666,format=webp/_astro/get-started.D7KXWcs4.png" alt="Try out the free version of Magic Network Monitoring" loading="lazy" decoding="async" width="852" height="666"> <p>For more details, refer to the <a href="https://developers.cloudflare.com/network-flow/get-started/">Get started guide</a>.</p>Tue, 24 Sep 2024 00:00:00 GMTNetwork FlowNetwork FlowAI Crawl Control - AI Crawl Controlhttps://developers.cloudflare.com/changelog/post/2024-09-23-ai-audit-launch/https://developers.cloudflare.com/changelog/post/2024-09-23-ai-audit-launch/<p>Every site on Cloudflare now has access to <a href="https://developers.cloudflare.com/ai-crawl-control/"><strong>AI Audit</strong></a>, which summarizes the crawling behavior of popular and known AI services.</p> <p>You can use this data to:</p> <ul> <li>Understand how and how often crawlers access your site (and which content is the most popular).</li> <li>Block specific AI bots accessing your site.</li> <li>Use Cloudflare to enforce your <code>robots.txt</code> policy via an automatic WAF rule.</li> </ul> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1494,height=746,format=webp/_astro/ai-crawl-control-overview.Dr_yGKOC.png" alt="View AI bot activity with AI Audit" loading="lazy" decoding="async" width="1494" height="746"> <p>To get started, explore <a href="https://developers.cloudflare.com/ai-crawl-control/">AI audit</a>.</p>Mon, 23 Sep 2024 00:00:00 GMTAI Crawl ControlAI Crawl ControlCache - One-click Cache Rules templates now availablehttps://developers.cloudflare.com/changelog/post/2024-09-05-cache-rules-templates/https://developers.cloudflare.com/changelog/post/2024-09-05-cache-rules-templates/<p>You can now create optimized cache rules instantly with <strong>one-click templates</strong>, eliminating the complexity of manual rule configuration.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ol> <li>Navigate to <strong>Rules</strong> &gt; <strong>Templates</strong> in your Cloudflare dashboard.</li> <li>Select a template for your use case.</li> <li>Click to apply the template with sensible defaults.</li> <li>Customize as needed for your specific requirements.</li> </ol> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="available-cache-templates">Available cache templates</h4><a class="anchor-link" href="#available-cache-templates"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <ul> <li><strong>Cache everything</strong>: Adjust the cache level for all requests.</li> <li><strong>Bypass cache for everything</strong>: Bypass cache for all requests.</li> <li><strong>Cache default file extensions</strong>: Replicate Page Rules caching behavior by making only default extensions eligible for cache.</li> <li><strong>Bypass cache on cookie</strong>: Bypass cache for requests containing specific cookies.</li> <li><strong>Set edge cache time</strong>: Cache responses with status code between 200 and 599 on the Cloudflare edge.</li> <li><strong>Set browser cache time</strong>: Adjust how long a browser should cache a resource.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, go to <a href="https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules" target="_blank" rel="noopener"><strong>Rules &gt; Templates</strong><span class="external-link"> ↗</span></a> in the dashboard. For more information, refer to the <a href="https://developers.cloudflare.com/cache/how-to/cache-rules/">Cache Rules documentation</a>.</p>Thu, 05 Sep 2024 00:00:00 GMTCacheCacheRules - New Rules Templates for One-Click Rule Creationhttps://developers.cloudflare.com/changelog/post/2024-09-05-rules-templates/https://developers.cloudflare.com/changelog/post/2024-09-05-rules-templates/<p>Now, you can create <strong>common rule configurations</strong> in just <strong>one click</strong> using Rules Templates.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=424,format=webp/_astro/rules-templates.DAV0GOXF.gif" alt="Rules Templates" loading="lazy" decoding="async" width="800" height="424"> <p>What you can do:</p> <ul> <li><strong>Pick a pre-built rule</strong> – Choose from a library of templates.</li> <li><strong>One-click setup</strong> – Deploy best practices instantly.</li> <li><strong>Customize as needed</strong> – Adjust templates to fit your setup.</li> </ul> <p>Template cards are now also available directly in the rule builder for each product.</p> <p>Need more ideas? Check out the <a href="https://developers.cloudflare.com/rules/examples/">Examples gallery</a> in our documentation.</p>Thu, 05 Sep 2024 00:00:00 GMTRulesRulesCache - Regionalized Generic Tiered Cache for higher hit ratioshttps://developers.cloudflare.com/changelog/post/2024-07-19-regionalized-generic-tiered-cache/https://developers.cloudflare.com/changelog/post/2024-07-19-regionalized-generic-tiered-cache/<p>You can now achieve higher cache hit ratios with <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#generic-global-tiered-cache">Generic Global Tiered Cache</a>. Regional content hashing routes content consistently to the same upper-tier data centers, eliminating redundant caching and reducing origin load.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="how-it-works">How it works</h4><a class="anchor-link" href="#how-it-works"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>Regional content hashing groups data centers by region and uses consistent hashing to route content to designated upper-tier caches:</p> <ul> <li>Same content always routes to the same upper-tier data center within a region.</li> <li>Eliminates redundant copies across multiple upper-tier caches.</li> <li>Increases the likelihood of cache HITs for the same content.</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="example">Example</h4><a class="anchor-link" href="#example"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>A popular image requested from multiple edge locations in a region:</p> <ul> <li><strong>Before</strong>: Cached at 3-4 different upper-tier data centers</li> <li><strong>After</strong>: Cached at 1 designated upper-tier data center</li> <li><strong>Result</strong>: 3-4x fewer cache MISSes, reducing origin load and improving performance</li> </ul> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="get-started">Get started</h4><a class="anchor-link" href="#get-started"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>To get started, enable <a href="https://developers.cloudflare.com/cache/how-to/tiered-cache/#generic-global-tiered-cache">Generic Global Tiered Cache</a> on your zone.</p>Fri, 19 Jul 2024 00:00:00 GMTCacheCacheRisk Score - Exchange user risk scores with Oktahttps://developers.cloudflare.com/changelog/post/2024-06-17-okta-risk-exchange/https://developers.cloudflare.com/changelog/post/2024-06-17-okta-risk-exchange/ <p>Beyond the controls in <a href="https://developers.cloudflare.com/cloudflare-one/">Zero Trust</a>, you can now <a href="https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/#send-risk-score-to-okta">exchange user risk scores</a> with Okta to inform SSO-level policies.</p> <p>First, configure Cloudflare One to send user risk scores to Okta.</p> <ol> <li>Set up the <a href="https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/okta/">Okta SSO integration</a>.</li> <li>In the <a href="https://dash.cloudflare.com/" target="_blank" rel="noopener">Cloudflare dashboard<span class="external-link"> ↗</span></a>, go to <strong>Zero Trust</strong> &gt; <strong>Integrations</strong> &gt; <strong>Identity providers</strong>.</li> <li>In <strong>Your identity providers</strong>, locate your Okta integration and select <strong>Edit</strong>.</li> <li>Turn on <strong>Send risk score to Okta</strong>.</li> <li>Select <strong>Save</strong>.</li> <li>Upon saving, Cloudflare One will display the well-known URL for your organization. Copy the value.</li> </ol> <p>Next, configure Okta to receive your risk scores.</p> <ol> <li>On your Okta admin dashboard, go to <strong>Security</strong> &gt; <strong>Device Integrations</strong>.</li> <li>Go to <strong>Receive shared signals</strong>, then select <strong>Create stream</strong>.</li> <li>Name your integration. In <strong>Set up integration with</strong>, choose <em>Well-known URL</em>.</li> <li>In <strong>Well-known URL</strong>, enter the well-known URL value provided by Cloudflare One.</li> <li>Select <strong>Create</strong>.</li> </ol>Mon, 17 Jun 2024 00:00:00 GMTRisk ScoreRisk ScoreAccess, Browser Isolation, CASB, Cloudflare Tunnel for SASE, Digital Experience Monitoring, Data Loss Prevention, Email security, Gateway, Multi-Cloud Networking, Cloudflare Network Firewall, Network Flow, Magic Transit, Cloudflare WAN, Network Interconnect, Risk Score, Cloudflare One Client - Explore product updates for Cloudflare Onehttps://developers.cloudflare.com/changelog/post/2024-06-16-cloudflare-one/https://developers.cloudflare.com/changelog/post/2024-06-16-cloudflare-one/ <p>Welcome to your new home for product updates on <a href="https://developers.cloudflare.com/cloudflare-one/">Cloudflare One</a>.</p> <p>Our <a href="https://developers.cloudflare.com/changelog/">new changelog</a> lets you read about changes in much more depth, offering in-depth examples, images, code samples, and even gifs.</p> <p>If you are looking for older product updates, refer to the following locations.</p> <details open class="border-border my-4 rounded-lg border px-4 py-2" data-astro-cid-nziubcoq><summary class="cursor-pointer font-medium" data-astro-cid-nziubcoq><p>Older product updates</p> </summary><ul> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/access/">Access</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/browser-isolation/">Browser Isolation</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/casb/">CASB</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/tunnel/">Cloudflare Tunnel</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/dlp/">Data Loss Prevention</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/dex/">Digital Experience Monitoring</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/email-security/">Email security</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/gateway/">Gateway</a></li> <li><a href="https://developers.cloudflare.com/multi-cloud-networking/changelog/">Multi-Cloud Networking</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-network-firewall/changelog/">Cloudflare Network Firewall</a></li> <li><a href="https://developers.cloudflare.com/network-flow/changelog/">Magic Network Monitoring</a></li> <li><a href="https://developers.cloudflare.com/magic-transit/changelog/">Magic Transit</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-wan/changelog/">Magic WAN</a></li> <li><a href="https://developers.cloudflare.com/network-interconnect/changelog/">Network Interconnect</a></li> <li><a href="https://developers.cloudflare.com/cloudflare-one/changelog/risk-score/">Risk score</a></li> <li><a href="https://developers.cloudflare.com/changelog/cloudflare-one-client/">Cloudflare One Client</a></li> </ul></details>Sun, 16 Jun 2024 00:00:00 GMTAccessAccessBrowser IsolationCASBCloudflare Tunnel for SASEDigital Experience MonitoringData Loss PreventionEmail securityGatewayMulti-Cloud NetworkingCloudflare Network FirewallNetwork FlowMagic TransitCloudflare WANNetwork InterconnectRisk ScoreCloudflare One ClientCloudflare Web Analytics - Easily Exclude EU Visitors from RUMhttps://developers.cloudflare.com/changelog/post/2025-02-25-rum-exclude-eu/https://developers.cloudflare.com/changelog/post/2025-02-25-rum-exclude-eu/<p>You can now easily enable Real User Monitoring (RUM) monitoring for your hostnames, while safely dropping requests from visitors in the European Union to comply with GDPR and CCPA.</p> <img src="https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1101,height=1061,format=webp/_astro/2025-02-26-rum-eu.X0ZtbXWA.png" alt="RUM Enablement UI" loading="lazy" decoding="async" width="1101" height="1061"> <p>Our Web Analytics product has always been centered on giving you insights into your users' experience that you need to provide the best quality experience, without sacrificing user privacy in the process.</p> <p>To help with that aim, you can now selectively enable RUM monitoring for your hostname and exclude EU visitor data in a single click. If you opt for this option, we will drop all metrics collected by our EU data centers automatically.</p> <p>You can learn more about what metrics are reported by Web Analytics and how it is collected <a href="https://developers.cloudflare.com/web-analytics/data-metrics/">in the Web Analytics documentation</a>. You can enable Web Analytics on any hostname by going to the <a href="https://dash.cloudflare.com/?to=/:account/web-analytics/sites" target="_blank" rel="noopener">Web Analytics<span class="external-link"> ↗</span></a> section of the dashboard, selecting "Manage Site" for the hostname you want to monitor, and choosing the appropriate enablement option.</p>Mon, 26 Feb 2024 00:00:00 GMTCloudflare Web AnalyticsCloudflare Web Analytics